十年網站開發(fā)經驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網站問題一站解決
在寧晉等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統性、市場前瞻性、產品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供網站設計制作、網站設計 網站設計制作定制網站制作,公司網站建設,企業(yè)網站建設,品牌網站建設,成都全網營銷,成都外貿網站制作,寧晉網站建設費用合理。
上面文章講完了插入排序和交換排序,本次我們來討論選擇排序。
選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完。 選擇排序是不穩(wěn)定的排序方法(比如序列[5, 5, 3]第一次就將第一個[5]與[3]交換,導致第一個5挪動到第二個5后面)。
1、普通(單個)選擇排序
每遍歷一次,記錄下最值元素所在位置,遍歷結束后,將此最值元素調整到合適的位置。這樣一次遍歷,只需一次交換,便可將最值放置到合適位置
//成功返回0,失敗返回-1 int select_sort(int *arr,const int n) { //判斷參數是否正確 if(NULL == arr || 0 >= n) return -1; int i = 0; //循環(huán)使用 int j = 0; //循環(huán)使用 int k = -1; //記錄比較的下標 int temp; //交換時作中間值 //每次循環(huán)只進行一次交換 最多進行n - 1次循環(huán),因此總體上,比冒泡進行交換的次數少 for(i = 0; i < n - 1; i++) { //第i次排序時,已經進行了i次大循環(huán),因此已經排好了i個元素 //已排好序的元素0,,...,i-2,i-1 //待排元素為i,i+1,...,n-1 k = i; //拿i的位置值與后面的值相比較 for(j = i + 1; j < n; i++) { if(arr[k] < arr[j]) k = j; } //判斷k值是否有變化,有變量就交換 if(k != i) { temp = arr[k]; arr[k] = arr[i]; arr[i] = temp; } } return 0; }
2、二分選擇排序
int select_sort(int *arr, const int n) { //判斷參數是否正確 if(NULL == arr || 0 >= n) return -1; int i = 0; int j = 0; int minpos = -1; int maxpos = -1; int temp; //每次循環(huán)完進行二次交換 最多進行n/2次循環(huán),因此總體上,比冒普通選擇排序的次數少 for(i = 0; i < n / 2; i++) { minpos = i; maxpos = i; for(j = i + 1; j < n; j++) { if(arr[j] > arr[maxpos]) { maxpos = j; continue; } if(arr[j] < arr[minpos]) { minpos = j; } } temp = arr[i]; arr[i] = arr[minpos]; arr[minpos] = temp; if(maxpos == i) { temp = arr[minpos]; arr[minpos] = arr[n - 1 - i]; arr[n - 1 - i] = temp; } else { temp = arr[maxpos]; arr[maxpos] = arr[n - 1 - i]; arr[n - 1 -i] = temp; } } return 0; }