[C语言] 选择排序之直接选择排序的特性及实现
1、算法特性
直接选择是一种简单、不稳定的选择排序方法,属于最为基础的排序方法之一。
其时间复杂度最好情况为O(n²)、最差为O(n²)、平均为O(n²),空间复杂度为O(1)。
2、算法思路:
以升序排列为例,先设置一个临时变量index_nmax存储最大值的下标,初始一般假设为下标0,再将选定值与其之后的数据依次比较:当比较值比选择值大时,index_nmax更新为比较值的下标,之后继续检索,直到无序序列结束为止;当比较值小于等于插入值时,index_nmax不更新,选择值继续向后检索,直到无序序列结束为止。一轮循环过后将arr[index_nmax]与无序序列队尾交换位置,经过len-1循环便可以将所有数据排列有序。
下图与本博客算法本质上是相同的,博客中选择最大值来排序,图中是选择最小值来排序:
3、实现代码
1 #include <stdio.h> 2 3 // 选择排序:相邻两个元素进行比较,把大的元素的下标记录下来,一轮完整的比较之后,若最大值的下标不是len-i,则两个元素交换位置 4 void select_sort(int arr[],int len) 5 { 6 for(int i=0; i<len; i++) // 总共要找len-1次最大值,每次找最大值的区间 [0,len-i] 7 { 8 int index_nmax = 0; 9 for(int j=1; j<len-i; j++) // 因为假设了0下标就是最大值,所以循环可以从1开始 10 { 11 if(arr[j] > arr[index_nmax]) 12 { 13 index_nmax = j; 14 } 15 } 16 if(index_nmax != len-i-1) // 避免无意义的位置交换 17 { 18 int tmp = arr[index_nmax]; 19 arr[index_nmax] = arr[len-i-1]; 20 arr[len-i-1] = tmp; 21 } 22 } 23 } 24 25 int main() 26 { 27 int arr[] = {53,82,9,233,43,14,55,9,4,67}; 28 int len = sizeof(arr)/sizeof(arr[0]); 29 30 travel(arr,len); 31 select_sort(arr,len); 32 travel(arr,len); 33 34 /* travel(arr,len); 35 cooktail_sort(arr,len); 36 travel(arr,len);*/ 37 38 return 0; 39 }
4、测试结果