排序算法2——图解简单选择排序及其实现

排序算法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;
}

猜你喜欢

转载自blog.csdn.net/CSDN_dzh/article/details/84942993
今日推荐