1.目的
這幾天看別人的算法博客,發現有些人的代碼存在錯誤。並且在搜索引擎上排名非常高,誤導了很多人,所以自己寫了這篇博客。
---------------------------------------
2018-4-2 今天有人評論才發現自己也寫錯了,沒有認真考慮,重新改了一下,再次驗證了多次.謝謝那位兄弟及時指正.
2.算法描述
二元選擇排序是對簡單選擇排序的一種改進。簡單選擇排序就是從數據中選擇出最小的值與第一個位置的數據交換,然后在剩下的數據中選擇最小的值與第二個位置的數據交換以此類推。而二元選擇排序就是在每次選出數據中的最大值與最小值分別和第一位和最后一位交換。所以外層循環次數就從n次變為了n/2次.
3.代碼
1 /** 2 * time:2017年12月28日 3 * author:Triomphe 4 */ 5 6 #include <stdio.h> 7 #include <stdlib.h> 8 9 void printArray(int a[], int n); 10 11 //二元選擇排序 12 void TwoSelectSort(int a[], int n) { 13 int i, j, mintmp, maxtmp, max, min; 14 15 for (i = 0; i<n / 2; i++) { 16 min = i, max = i; //先將最小值與最大值下標指向未排序的第一個數。 17 for (j = i + 1; j<n - i; j++) { 18 if (a[j]<a[min]) { 19 min = j; 20 continue; 21 } 22 if (a[j]>a[max]) { 23 max = j; 24 } 25 } 26 //最小值是否已經在正確的位置上了. 27 if (min != i) { 28 mintmp = a[min]; 29 a[min] = a[i]; 30 a[i] = mintmp; 31 } 32 //可能出現最大值存儲在a[i],那么經過上一步交換,a[i]上存儲的最大值已經被換到了a[min]所在位置. 33 if (max == i) { 34 max = min; 35 } 36 //最大值是否已經在正確的位置上了 37 if (max != n - i - 1) { 38 maxtmp = a[max]; 39 a[max] = a[n - i - 1]; 40 a[n - i - 1] = maxtmp; 41 } 42 43 printArray(a, n); 44 printf("\n"); 45 } 46 } 47 48 //輸出數組 49 void printArray(int a[], int n) { 50 int i; 51 for (i = 0; i<n; i++) { 52 printf("%d ", a[i]); 53 } 54 } 55 56 57 int main() 58 { 59 //定義的數組 60 //int data[] = { 275,322,12,2,23,12,43,123,22,3,56,34,99,12,1232,3,14,45,22,22,11,44,74 }; 61 int data[20]; 62 for(int i=0;i<20;i++){ 63 data[i] =1+(int)(rand() % 50); 64 } 65 int n = sizeof(data) / sizeof(data[0]); //數組中數據量 66 TwoSelectSort(data, n); 67 printArray(data, n); 68 return 0; 69 }
4.最終結果