前言
1、选择排序(Selection Sort)的基本思想
选择排序的基本思想:每趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。
常用的选择排序方法有直接选择排序和堆排序。
一、直接选择排序
1、直接选择排序的基本思想
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
第1趟从R[0]~R[n-1]中选取最小值,与R[0]交换;
第2趟从R[1]~R[n-1]中选取最小值,与R[1]交换;
第i趟从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换;
直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接插入排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选择一个最小的元素直接放到有序区的最后。
2、直接选择排序算法的核心
-
确定待排序的数据R[0…n]
-
确定需比较的数据R[i…n]
-
每次找出最小值,进行交换
3、直接选择排序算法的示例
给定一组数据[8 3 2 5]
第一次交换 8<->2
2 3 8 5
第二次交换 3<->3
2 3 8 5
第三次交换 8<->5
2 3 5 8
4、直接选择排序算法实现
#include<stdio.h>
void Swap(int &a, int &b)
{
a ^= b;
b ^= a;
a ^= b;
}
void SelectSort(int *arr, int len)
{
int i,j; // 为循环做准
int iMin; // 存储每次最小值
int temp; // 作为临时存储值
for (i=0; i<len-1; i++) // 进行len-1趟比较即可
{
iMin = i; // 存储每次最小值
for (j=i+1; j<len; j++) // 第i次需要与之比较的数据
{
if (arr[iMin]>arr[j])
{
iMin = j; // 记录最小值的位置
}
}
Swap(arr[i],arr[iMin]);
}
}
int main()
{
int arr[] = { 5, 8, 6, 3, 9, 2, 1, 7 };
int len = sizeof(arr) / sizeof(arr[0]);
int i = 0;
printf("排序前:");
for (i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
SelectSort(arr, len);
printf("排序后:");
for (i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
5、直接选择排序算法的性能分析
直接选择排序是一个就地排序,但是直接选择排序不是稳定的。直接选择排序的平均时间复杂度,而它的最坏情况时间复杂度也。