C语言排序算法学习笔记——选择类排序

时间:2021-04-09 07:03:03

选择排序:每一趟(例如第i趟)在后面n-i+1(i=1,2,3,……,n-1)个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到n-1趟做完,待排序元素只剩下1个,就不用再选了。

简单选择排序:其实现为

void SelectSort(ElemType A[],int n){
for(i=;i<n-;i++){
min=i; //min存的是当前最小元素所在下标,初值设为第i个
for(j=i+;j<n;j++) //从第i个元素往后找,一直找到最后一个元素
if(A[j]<A[min]) min=j; //如果这个值更小,更新min的值
if(min!=i){ //如果第i个元素不是剩下元素最小的,则和最小的进行交换
ElemType temp=A[i];
A[i]=A[min];
A[min]=temp;
}
}
}

空间复杂度:O(1)。

时间复杂度:O(n2)。

稳定性:不稳定,交换部分会打破相对顺序。

堆:是一颗完全二叉树,而且满足任何一个非叶结点的值都不大于(或不小于)其左右孩子结点的值。

①如果是每一个结点的值都不小于它的左右孩子结点的值,则称其为大顶堆;

②如果是每一个结点的值都不大于它的左右孩子结点的值,则称其为小顶堆。

堆排序:我们知道对于一个堆来说,它的根结点是整个堆中所有结点的值的最大值(大顶堆)或者最小值(小顶堆)。所以堆排序的思想就是每次将无序序列调整成一个堆,然后从堆中选择堆顶元素的值,这个值加入有序序列,无序序列减少一个,再反复调节无序序列,直到所有的关键字都加入到有序序列。

堆排序的实现以后更新,挖个坑