一、直接选择排序的思想
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
1、 初始状态:无序区为array[1…n],有序区为空;
2、 第一趟排序:
在无序区array[1…n]中选出关键字最小的记录array[k],将它与无序区的第1个记录array[0]交换,使array[1..1]和array[2…n]分别为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
……..
3、第i趟排序
第i趟排序开始时,当有序区和无序区分别为array[0…i-1]和array[i…n-1]。该趟排序从当前无序区中选出关键字最小的记录array[k],将它与无序区的第1个记录array[i]交换。使R[1..i]和R[i+1..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
二、C代码实现
- #include "stdio.h"
- /*
- * 函数:choose_sort(int *array, int n)
- * 功能:插入排序
- * 参数:n为数组元素的个数
- */
- void choose_sort(int array[],int n)
- {
- int i,j;
- int b,temp,num;
- for(i=0;i<n-1;i++)
- {
- temp=i;
- for(j=i+1;j<n;j++)
- {
- if(array[j]<=array[temp])//获取待排序的元素中最小的元素
- {
- temp=j;//记录最小元素的下标
- }
- }
- if(i!=temp)
- {
- b=array[temp];
- array[temp]=array[i];
- array[i]=b;
- }
- }
- }
- int main(int argc,char *argv[])
- {
- int array[]={3,8,4,7,1};
- choose_sort(array,5);
- for(int i=0;i<5;i++)
- {
- printf("%d ",array[i]);
- }
- printf("\n");
- return 0;
- }
三、直接选择排序的时间
直接选择排序的平均时间复杂度为O(n*n),并且是一种不稳定的排序。