比较类排序系列-选择排序
1. 原理
选择排序的思想不难理解。选择排序把数据分成两组来看待,一组已经有序的数据和一组无序的数据,排序开始之前,有序数据的个数为0。
每次从未排序的数据中选取最小值,并与未排序的最左数据进行交换,直到未排序的数据为0,则结束排序。
算法过程如下图所示
- 上图黄色数据表示已经有序的数据,红色数据表示已遍历的未排序数据中的最小值,最小值在遍历中过程中会发生变化,直到找到全局最小值,再把它未排序的最左数据进行交换。
2. 代码
void swap(int* array, int i, int j)
{
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
void selectSort(int* arr, int n){
//i: 未排序数据的起始位置
for(int i = 0; i < n; ++i)
{
int minIdx = i;
//从所有未排序的数据中找最小值的索引
for(int j = i + 1; j < n; ++j){
if(arr[j] < arr[minIdx])
minIdx = j;
}
swap(arr, minIdx, i);
}
}
public static void swap(int[] arr, int i, int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
public static void selectSort(int[] arr){
//i: 未排序数据的起始位置
for(int i = 0; i < arr.length; ++i)
{
int minIdx = i;
//从所有未排序的数据中找最小值的索引
for(int j = i + 1; j < arr.length; ++j){
if(arr[j] < arr[minIdx])
minIdx = j;
}
swap(arr, minIdx, i);
}
}
3. 时间空间复杂度
3.1 时间复杂度
选择排序每次需要遍历未排序的数据,寻找最小值,对于n个数据来说,需要比较的次数为(n - 1) + (n - 2) + …+ 1,所以其时间复杂度为O(n^2)。
3.2 空间复杂度
选择排序中占用的空间为常数个空间,所以其空间复杂度为O(1)。
总结
选择排序并不适合大数据集的排序,因为其时间效率比较差,在实际中并不常用。