排序算法1——图解冒泡排序及其实现(三种方法,基于模板及函数指针)
排序算法2——图解简单选择排序及其实现
排序算法3——图解直接插入排序以及折半(二分)插入排序及其实现
排序算法4——图解希尔排序及其实现
排序算法5——图解堆排序及其实现
排序算法6——图解归并排序及其递归与非递归实现
排序算法7——图解快速排序以及不同CUTOFF的时间测试
基本思想
通过
n-i
次关键字之间的比较,从n-i+1
个记录中选出关键字最小的记录,并和第i个记录作交换
代码和上下界
比较过程如下
这样,最多经过
n-1
次交换,就能完成排序操作
下面分析简单选择排序的时间复杂度
无论最好或最坏的情况下,其比较次数都是一样多的,
第i趟需要进行n-i
次关键字的比较,总共需要比较∑(n-i)=n(n-1)/2次,i从1到n-1
,
而对于交换次数来说,当最好的时候,不需要进行数据的交换
而当逆序的时候,交换次数为n-1
次,
最终的排序时间是比较与交换的次数总和,
因此,总的时间复杂度为O(N^2)
虽然与冒泡排序相比,时间复杂度相等,但简单选择排序的性能比冒泡排序要好一些
测试结果和代码
#include <iostream>
template<class T>
void SelectSort(T *a, int length) {
int min;
int i, j;
for (i = 0; i < length - 1; ++i) {
min = i;
for (j = i + 1; j < length; ++j) {
if (a[min] > a[j]) {
min = j;
}
}
if (i != min) {
T tmp;
tmp = a[min];
a[min] = a[i];
a[i] = tmp;
}
}
}
template<class T>
void ArrShow(T *a, int length) {
for (int i = 0; i < length; ++i) {
std::cout << a[i] << " ";
}
puts("\n");
}
int main(int argc, char *argv[]) {
int test[9] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
ArrShow(test, 9);
puts("SelectSort : ");
SelectSort(test, 9);
ArrShow(test, 9);
return 0;
}