选择排序,思想非常简单,分为selectMax和selectSort两个部分。
selectMax:
每次选择区间内最大的数,返回其Index
selectSort
1、从右到左依次扫描i(除idx=0,因为选到最后,最小的一定在最左边),规定区间为[0, i]
2、调用selectMax,获得最大的maxIndex。
3、这个i位置应该是第i大的数的位置,也就是maxIndex的数的位置,因此,如果i!=maxIndex,swap之。
算法复杂度,不管是最坏、平均还是最好,都是O(N^2)。
#include <stdio.h> typedef long TYPE; int cmp(TYPE a, TYPE b) { return a - b; } void swap(TYPE* a, TYPE* b) { TYPE tmp = *a; *a = *b; *b = tmp; } int selectMax(TYPE* arr, int left, int right, int (*cmp)(TYPE a, TYPE b)) { int maxIndex = left; int i = left + 1; while(i<=right) { if(cmp(arr[i], arr[maxIndex])>0) { maxIndex = i; } i++; } return maxIndex; } void selectSort(TYPE* arr, int n, int (*cmp)(TYPE a, TYPE b)) { int i; int maxIndex; for(i=n-1 ; i>0; i--) { maxIndex = selectMax(arr, 0, i, cmp); if(maxIndex!=i) { swap(&arr[maxIndex], &arr[i]); } } } int main() { TYPE arr[] = {5,4,3,2,1,-2}; int len = sizeof(arr) / sizeof(TYPE); int i; //Test select max //printf("Max INdex\t%d\n",selectMax(arr, 1, len-1, cmp)); //Select Sort selectSort(arr, len, cmp); //Print for(i=0; i<len; i++) { printf("%ld ", arr[i]); } printf("\n"); }