首页 > 技术文章 > 选择排序(C)

caso 2019-11-23 20:11 原文

选择排序

  顾名思义,先在数据集合中选出最大或最小元素的位置,依次排列位置顺序,之后再从剩余元素中找出最大或最小元素的位置,排于其次,直到仅剩一个元素时,完成排序。

算法描述

假设:对于集合N【len】进行选择排序,i 为排序次数,0 <= i < len - 1 对于 len 个元素进行 len - 1 次排序即可
第 1 次排序: 次数 i = 0 开始
  先从 len - 1 个元素中找出最小元素的位置 min(顺序),即:j = 0; j < len; j++;
  然后N【min】与 N【0】元素互换位置,此时元素N【0】就是集合N中最小的元素;
  继续下一轮排序 i++;
第 i 次排序:次数 i < len - 1
  当进行第 i 次排序时, 需要从剩下的 第 i 到 第(len -1)个元素中找出最小元素的位置 min,
  因为前面 i -1 个元素已经按顺序排列,即:j = i; j < len; j++;
  然后N【min】与N【i】元素互换位置,此时元素N【i】就是剩余元素中最小的元素;
  到此前面 0 到 i 个元素按顺序排列,i++ 继续执行下一轮排序,直到 i = len - 2 时完成排序;

示例代码

下面用 C语言实现一下选择排序

void select_Sort(int *N, int len)
{
	int i, j, min, temp;
	for(i = 0; i < len - 1; i++) {
		min = i;
		for(j = i + 1; j < len; j++) {
			if(N[j] < N[min]) {
				min = j;	// min一直存放较小元素的位置
			}
		}
		if(i != min) {	// 如果当前N[i]就是最小的元素,无需交换位置
			temp = N[i];
			N[i] = N[min];
			N[min] = temp;
		}
	}
}
执行结果

下图将整个选择排序过程显示出来
在这里插入图片描述

算法复杂度

  空间复杂度为O(1),只需要一个临时变量辅助空间;时间复杂度为O(n^2),比较次数与关键字的初始状态无关,总的比较次数N= (n -1) + (n -2) + … + 2 + 1 = n*( n -1) / 2。交换次数O( n),最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次。交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,当 n 值较小时,选择排序比冒泡排序快。

  选择排序是也一种不稳定排序,比如序列【3, 4, 3, 1,5】,如下图所示:

在这里插入图片描述
排序前后,两个相同数值 3 的前后位置发生对调,验证其不稳定性。

推荐阅读