八大排序中其他排序
直接插入排序
希尔排序
文章目录
前言
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
选择排序原理
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
简单来说,选择排序就是每一趟挑出待排序序列最小值和待排序序列的第一个值,进行交换(如果是同一个值,则可以省略)
我们每次都需要遍历一遍数组,每次保存的值是最小值的下标,而不是最小值本身
如果保存最小值的下标,我们既可以知道最小值在哪,又可以知道最小值的大小
如果保存最小值的值,我们就无法知道最小值在哪个位置了
在这个待排数组中,我们首先遍历一遍,找到一个最小值,并将最小值与未排序的第一个值交换,我们遍历一遍可以发现,2是最小值,将2与12交换
此时 2 已经排序完成 ,未排序的第一个值此时就是21,然后从未排序数组中找到一个最小值(8),与21交换。(因为上一轮2 已经是最小的了,所以这一次的最小值(8)一定比2 大)
以此类推,直到排序到第五躺,数据已经全部完成
此时排序第六趟就没有意义了,因为最后一个数据本身就是最大的数据
代码实现
//选择排序:每一趟,挑出待排序序列的最小值和待排序序列的第一个值,进行交换(如果是同一个值,可以省略交换步骤)
//时间复杂度O(n^2) 空间复杂度O(1) 稳定性:不稳定
void SelectSort(int *arr, int len)
{
for(int i=0; i<len-1; i++)//趟数
{
//min_index 永远保存更小值的下标
int min_index = i;//min_index保存的是待排序序列的第一个值下标,用于一会的比较
for(int j=i+1; j<len; j++)//这个循环是为了保存待排序队列的最小值的下标,j代表待排序序列的第二个值下标
{
if(arr[min_index] > arr[j])
{
min_index = j;
}
}
//此时,这一趟跑完,min_index 指向的是最小值的下标
//待排序最小值需要和待排序序列的第一个值进行交换
if(min_index != i)//当待排序序列的最小值的下标 不等于 待排序序列的第一个值的下标,才有交换的必要性
{
int tmp = arr[min_index];
arr[min_index] = arr[i];
arr[i] = tmp;
}
}
}