算法熟记-排序系列-选择排序
2011-06-07 22:38
344 查看
1. 简述
假设待排序数组为 int array[], 数组长度为n。
第1趟排序,从array[0]-array[n-1]中,选择最小的元素,如果该元素不是array[0],则与其交换。
第2趟排序,从array[1]-array[n-1]中,选择最小的元素,如果该元素不是array[1],则与其交换。
···
第n-1趟排序,从array[n-2]-array[n-1]中,选择最小的元素,如果该元素不是array[n-2],则与其交换。
2. 复杂度
交换的次数介于[0,n-1],但是比较的次数是(n+1)*n/2左右。最好、最坏和平均的比较次数都是固定的,因此时间复杂度是O(n^2)。交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。
稳定性上,属于不稳定的排序。例如:5 8 5 2 9,第一次会把5和2交换,这样前面的5就会换到后面去了。
3. 代码
void selection_sort(int array[], int n) {
int pos;
for(int i=0; i<n-1; i++) {
pos = i;
for(int j=i+1; j<n; j++) {
if(array[j] < array[pos]) {
pos = j;
}
}
if(pos == i) continue;
swap(array[pos], array[i]);
}
}
4. 参考资料
维基百科-选择排序 http://en.wikipedia.org/wiki/Selection_sort
假设待排序数组为 int array[], 数组长度为n。
第1趟排序,从array[0]-array[n-1]中,选择最小的元素,如果该元素不是array[0],则与其交换。
第2趟排序,从array[1]-array[n-1]中,选择最小的元素,如果该元素不是array[1],则与其交换。
···
第n-1趟排序,从array[n-2]-array[n-1]中,选择最小的元素,如果该元素不是array[n-2],则与其交换。
2. 复杂度
交换的次数介于[0,n-1],但是比较的次数是(n+1)*n/2左右。最好、最坏和平均的比较次数都是固定的,因此时间复杂度是O(n^2)。交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。
稳定性上,属于不稳定的排序。例如:5 8 5 2 9,第一次会把5和2交换,这样前面的5就会换到后面去了。
3. 代码
void selection_sort(int array[], int n) {
int pos;
for(int i=0; i<n-1; i++) {
pos = i;
for(int j=i+1; j<n; j++) {
if(array[j] < array[pos]) {
pos = j;
}
}
if(pos == i) continue;
swap(array[pos], array[i]);
}
}
4. 参考资料
维基百科-选择排序 http://en.wikipedia.org/wiki/Selection_sort
相关文章推荐
- 【白话经典算法系列之四】 直接选择排序及交换二个数据的正确实现
- 白话经典算法系列之四 直接选择排序及交换二个数据的正确实现
- 白话经典算法系列之四 直接选择排序及交换二个数据的正确实现
- 算法熟记-排序系列-插入排序
- 算法熟记-排序系列-基数排序
- 算法熟记-排序系列-希尔排序
- 算法系列-直接选择排序
- 算法系列(三)排序算法上篇--冒泡排序插入排序和选择排序
- 白话经典算法系列之四 直接选择排序及交换二个数据的正确实现
- JavaScript ,Python,java,Go系列算法之选择排序
- 白话经典算法系列之四 直接选择排序及交换二个数据的正确实现
- 算法系列(三)排序算法上篇--冒泡排序插入排序和选择排序
- 傻瓜学算法系列之排序——3.选择排序
- 经典算法系列四----冒泡与选择排序
- 算法系列(二)冒泡排序、选择排序、插入排序和希尔排序(Java实现)
- 白话经典算法系列之四 直接选择排序及交换二个数据的正确实现
- 白话经典算法系列之四 直接选择排序及交换二个数据的正确实现
- 白话经典算法系列之四 直接选择排序及交换二个数据的正确实现
- 算法熟记-排序系列-归并排序
- 算法熟记-排序系列-堆排序