简单选择排序的思想
从后续的序列找出最小的元素然后交换
void SelectSort(int A[],int n){
int i,j;
int temp;
for(i = 0;i < n-1;i++){
int min = i;
for(j = i+1;j < n-1;j++){
if(A[i] > A[j]){
min = j;
}
}
Swap(A[i],A[j]);
}
}
属于不稳定的算法
堆排序
算法思想:
数组被排序成大根堆或者小根堆
大根堆:类似完全二叉树的排布,n/2向下取整的结点为非叶子结点,根节点的值大于左右结点的值
语言描述:
逐个排查n/2的结点,然后根据左右结点为i/2和i /2+1的结点进行比对,看是否满足大根堆的要求
直到满足为止
代码实现:
void BuildMaxHeap(int A[],int n){
for(int i = n/2;i > 0;i--){
HeadAdjust(A,i,n);
}
}
void HeadAdjust(int A[],int k,int n){
A[0] = A[k];
for(int i = k*2;i < n;i *= 2){
if(A[i+1] > A[i])
i = i+1;
if(A[0]>A[i])
break;
else{
A[k] = A[i];
k = i;
}
A[k] = A[0];
}
void HeadSOrt(int A[],int n){
BuildMaxHeap(A);
int i;
for(i = n;i >= 0;i--){
Swap(A[i],A[1]);
HeadAdjust(A,1,i-1);
}
}
在实现排序完成后,需要将堆顶元素和堆底元素互换,然后排除已经排序的序列,然后重新对堆顶元素进行排序
时间复杂度为O(nlog2n)
堆排序不稳定
堆的插入和删除
堆的插入,需要插入表尾,然后根据对比父节点,如果比父节点小,则进行交换,直到父节点比该结点小为止
堆的删除,用堆底的元素代替,然后进行下调