一、简单选择排序
空间复杂度:O(1)
时间复杂度:O(n^2)
稳定性:不稳定
适用性:顺序表、链表
//简单选择排序
void SelectSort(int A[],int n){
for(i=0;i<n-1;i++){
min=i;
for(j=i+1;j<n;j++){
if(A[j]<A[min])
min=j;
}
if(min!=i)
swap(A[i],A[min]);
}
}
二、堆排序
空间复杂度:O(1)
时间复杂度:O(nlogn)
稳定性:不稳定
//堆排序
//首先,建立大根堆
void BuildMaxHeap(int A[],int len){
for(int i=len/2;i>=1;i--){
HeadAdjust(A,i,len);
}
}
//将以k为根的子树进行调整,可以将该子树变成大根堆
void HeadAdjust(int A[],int k,int len){
A[0]=A[k]; //先把根结点存起来
for(i=2*k;i<=len;i*=2){
if(i<len&&A[i+1]>A[i]) //右子树的值大于左子树
i++;
if(A[0]>=A[i]){
break;
}else{
A[k]=A[i];
k=i;
}
}
A[k]=A[0]; //k所指的位置为原来的根结点最后存放位置
}
//堆排序代码
void HeapSort(A[],int len){
BuildMaxHeap(A,len); //建立大根堆
for(i=len;i>1;i--){
swap(A[i],A[1]); //此时把A[1]放到了堆底,也就是数组的末尾
HeadAdjust(A,1,i-1);
}
}