基本思路
先默认未排序区首个元素为最小,然后从后面的元素中挑出最小的元素,与这个元素交换,直至循环完成。
算法代码
1 //简单的选择排序 2 void SelectSort(int *arr, int n) 3 { 4 int i, j; 5 int temp; 6 int minIndex; 7 for (i = 0; i < n - 1; i++) //做第i趟排序,共n-1趟,因为第n趟只剩一个一定是最大的 8 { 9 minIndex = i; 10 for (j = i + 1; j < n; j++) 11 { 12 if (arr[j] < arr[minIndex]) 13 minIndex = j; 14 } 15 if (minIndex != i) //后面有更小的元素 16 { 17 temp = arr[i]; 18 arr[i] = arr[minIndex]; 19 arr[minIndex] = temp; 20 } 21 } 22 }
算法分析
从i个记录中挑选最小记录需要比较i-1次。
第i(i=0~n-2)趟从n-i记录中挑选最小记录需要比较n-i-1。
对 n 个记录进行简单选择排序,所需进行的关键字的比较次数 总计为:
移动记录的次数,正序为最小值 0,反序为最大值3(n-1) 。
简单选择排序的最好、最坏和平均时间复杂度为O(n2)。