算法学习之选择排序和堆排序:
1.选择排序:
(1)思想:在每一趟待排序元素中选取关键字最小的元素加入有序子序列中。
(2)性能分析:空间复杂度O(1) 时间复杂度O(n^2)
(3) 稳定性:不稳定 ,适用于顺序表,链表。
(4)算法实现:
void SelectSort(int A[],int n){
for(int i=0;i<n-1;i++){
int min=i;
for(int j=i+1;j<n;j++)
if(A[j]<A[min])
min=j;
if(min!=i)
swap(A[i],a[min]);
}
}
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
void SelectSort(int A[],int n);
int main(){
int A[MAX];
int i,n;
printf("请输入待排数的个数:\n");
scanf("%d",&n);
printf("请输入待排数:\n");
for(i=0;i<n;i++)
scanf("%d",&A[i]);
SelectSort(A,n);
printf("排序结果为: \n");
Printfarry(A,n);
return 0;
}
void swap(int *a,int *b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}
void Printfarry(int A[],int n){
int i;
for(i=0;i<n;i++)
{
printf("%d\n",A[i]);
}
return;
}
void SelectSort(int A[],int n){
int i,j;
for( i=0;i<n-1;i++){
int min=i;
for(j=i+1;j<n;j++)
if(A[j]<A[min])
min=j;
if(min!=i)
swap(&A[i],&A[min]);
}
}
2.堆排序:
(1)算法思想:
建堆:编号<=n/2的所有节点依次做下坠调整(自底向上处理各分支节点),小元素逐层下坠(与关键字更大的孩子交换)
排序:将堆顶的元素加入有序子序列(堆顶元素与堆底元素交换),堆底元素换到堆顶后,需要进行下坠调整,恢复大根堆的特性,重复上述过程n-1趟。
(2)算法性能:
空间复杂度:O(1) 时间复杂度O(n*logn)
(3)稳定性:不稳定
(4)算法实现:
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
void HeapSort(int A[],int len);
void HeadAdjust(int A[],int k,int len);
int main(){
int A[MAX];
int i,k,len;
printf("请输入结点个数:\n");
scanf("%d",&len);
printf("请输入数据:\n");
for(i=0;i<len;i++)
scanf("%d",&A[i]);
HeapSort(A,len);
printf("堆排序的结果为:\n");
Printfarry(A,len);
return 0;
}
void HeadAdjust(int A[],int k,int len){
int q,temp;
temp=A[k];
while((q=2*k+1)<len){
if(q<len-1&&A[q]<A[q+1])
q++;
if(temp<A[q])
{
A[(q-1)/2]=A[q];
k=q;
}
else
break;
}
A[(q-1)/2]=temp;
}
void HeapSort(int A[],int len){
int i,k,temp;
i=(len-1)/2;
while(i>=0){
HeadAdjust(A,i,len);
i--;
}
i=len-1;
while(i>0){
temp=A[0];
A[0]=A[i];
A[i]=temp;
HeadAdjust(A,0,i);
i--;
}
}
void Printfarry(int A[],int n){
int i;
for(i=0;i<n;i++)
{
printf("%d\n",A[i]);
}
return;
}