选择排序 该算法的实现思想为:对于具有 n 个记录的无序表遍历 n-1 次,第 i 次从无序表中第 i 个记录开始,找出后序关键字中最小的记录,然后放置在第 i 的位置上。
例如对无序表{56,12,80,91,20}采用简单选择排序算法进行排序,具体过程为:
选择排序代码实现 #include <stdlib.h> #include <stdio.h>
void swap(int *x,int *y) { int itmp=*x; *x=*y; *y=itmp; } // 采用两层循环实现的方法。 // 参数arr是待排序数组的首地址,len是数组元素的个数。 void selectsort1(int *arr,unsigned int len) { int npos; if(len < 2) return ; for(int i = 0;i < len - 1;i++){ npos = i; for (int j = i+1; j < len; ++j) { if(arr[npos]>arr[j]) npos = j; } if(i!=npos) swap(&(arr[i]),&(arr[npos])); } }
// 采用递归实现的方法。 // 参数arr是待排序数组的首地址,len是数组元素的个数。 void selectsort2(int *arr,unsigned int len) { if(len < 2) return ; int npos = 0; for(int i = 0;i<len;i++){ if(arr[npos]>arr[i]) npos = i; } if(npos != 0) swap(&(arr[0]),&(arr[npos])); selectsort2(arr+1,--len); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 由以上的选择排序算法可知,每一趟选择都会选出最小的和第一个交换(第一个就最小除外),需要进行n次选择,可以优化为每一趟选择出两个(一个最大和一个最小的)分别个第一个与最后一个交换。只需要进行n/2次选择。
选择排序的优化 // 优化后的选择排序,作者:C语言技术网(www.freecplus.net)码农有道。 #include <stdlib.h> #include <stdio.h>
// 交换两个变量的值。 void swap(int *x,int *y) { int itmp=*x; *x=*y; *y=itmp; }
// 采用两层循环实现的方法。 // 参数arr是待排序数组的首地址,len是数组元素的个数。 void selectsort1(int *arr,unsigned int len) { if(len < 2) return ; int minPos; int maxPos; int lift = 0,right = len -1; while (lift < right){ minPos = maxPos = lift; for(int i = lift ;i<right;i++){ if(arr[minPos] > arr[i]) minPos = i; if(arr[maxPos] < arr[i]) maxPos = i; } if(lift != minPos) swap(&(arr[lift]),&(arr[minPos])); if(lift == right) maxPos = minPos; if(maxPos != right) swap(&(arr[right]),&(arr[maxPos])); lift ++; right --; } } // 采用递归实现的方法。 // 参数arr是待排序数组的首地址,len是数组元素的个数。 void selectsort2(int *arr,unsigned int len) { if(len < 2) return; int minPos = 0; int maxPos = 0; int lift = 0,right = len - 1; for(int i = lift;i<right;i++) { if (arr[minPos] > arr[i]) minPos = i; if (arr[maxPos] < arr[i]) maxPos = i; } if (lift != minPos) swap(&(arr[lift]), &(arr[minPos])); if (lift == right) maxPos = minPos; if (maxPos != right) swap(&(arr[right]), &(arr[maxPos])); len-=2; selectsort2(++arr,len); }