标签:
简单选择排序算法
一、基本思想:每一趟循环遍历都从待排序的记录中选出关键字最小的记录,顺序的放在已排好序的子表的最后,直到所有的记录排序完毕。
二、C 语言代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void selectSort(RecType R[], int n) 5 { 6 int i; 7 int j; 8 int k; 9 RecType tmp; 10 11 for (i = 0; i < n-1; i++) { 12 k = i; 13 14 //在当前无序区 R[i...n-1] 中选择 key 最小的 R[k] 15 for (j = i + 1; j < n; j++) { 16 if (R[j].key < R[k].key) { 17 k = j; //k 目前找到的最小关键字的位置 18 } 19 } 20 21 //交换 R[i] 和 R[k] 22 if (k != i) { 23 tmp = R[i];i 24 R[i] = R[k]; 25 R[k] = tmp; 26 } 27 } 28 }
三、算法分析
时间复杂度:由算法代码可知,简单选择排序是由两重循环组成,对于 n 个排序记录而言,外层必须经历 n-1 次循环,而内层则必须经历 (n-1-i) 次循环,其中 0 ≦ i ≦ n-1,并且每一次比较如需要交换记录排序位置都必须移动记录三次才能达到目的。故对于简单选择排序而言:
关键字比较和记录移动的最少次数是 (n-1)(n-i-1),其中 0 ≦ i ≦ n-1,算法的时间复杂度为 O(n²)。
关键字比较和记录移动的最多次数为 (n-1)[3(n-i-1)],其中 0 ≦ i ≦ n-1,算法的时间复杂度为 O(n²)。
关键字平均比较和记录移动次数为 (n-1)(n-i-1),其中 0 ≦ i ≦ n-1,算法的时间复杂度为 O(n²)。
空间复杂度:由算法代码可知,所需的额外空间只有一个 tmp 变量,故简单选择排序算法空间复杂度为 O(1)。
四、思考
简单选择排序算法的思想非常简单,但是效率非常低下,实际工程中应用很少,请问该如何优化算法?
标签:
原文地址:http://www.cnblogs.com/lishiyun19/p/4319601.html