两种选择排序算法:简单选择排序、堆排序

一、简单选择排序

空间复杂度: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); 
	} 
} 

猜你喜欢

转载自blog.csdn.net/KK_2018/article/details/108153153