[C语言] 选择排序之直接选择排序的特性及实现

[C语言] 选择排序之直接选择排序的特性及实现

 

1、算法特性

  直接选择是一种简单、不稳定的选择排序方法,其时间复杂度最好情况为O(n²)、最差为O(n²)、平均为O(n²),空间复杂度为O(1)。

 

2、算法思路:

  以升序排列为例,先设置一个临时变量index_nmax存储最大值的下标,初始值一般假设为下标0,再将它与它之后的数据从前往后依次进行比较。当比较值比选择值大时,index_nmax更新为比较值的下标,arr[j]继续向后检索,直到len-i为止;当比较值小于等于插入值时,index_nmax不更新,选择值继续向后检索,直到len-i为止。一轮循环过后将arr[index_nmax]与arr[len-i]交换位置,经过不断循环便可以将所有数据排列有序。

  下图与本博客算法本质上是相同的,博客中选择最大值来排序,图中是选择最小值来排序:

 

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、测试结果

猜你喜欢

转载自www.cnblogs.com/usingnamespace-caoliu/p/9428115.html