一、直接选择排序
二、堆排序
目录
基本定义
1)大根堆:树中任意一个非终端节点(如果有做孩子或者右孩子)的值比其孩子节点的值大。
2)小根堆:树中任意一个非终端节点的值都比其孩子节点小。
3)大根堆和小根堆用树来表示肯定是一棵完全二叉树。
代码
//堆排序(大根堆) //为使数组存放的元素的下标与该值对应的树中的标号一致,所以后面数据的存放都是从下标为1的存储单元开始 #include<stdio.h> //对堆的调整 void HeapAjust(int A[], int k, int len){ //此处是用一个数组依次来保存堆的数据 //当k这个节点与其双亲节点发生数据交换时,需要对节点k进行下沉操作 int i; A[0] = A[k]; i = 2*k; while(i <= len){ if(i < len && A[i] < A[i+1]){ i++; //求k的做孩子的下标 } if(A[0] >= A[i]){ //如果双亲节点的值比其孩子节点的值大,则不用往下往下调整,直接结束 break; } else{ A[k] = A[i]; k = i; //k的孩子节点所在的子树继续调整 } i *= 2; } A[k] = A[0]; } //建立大根堆 void BuildMaxHeap(int A[], int len){ //对所有非叶子节点从下往上,从右往左一次调整成大根堆 int i; for(i = len/2; i >=1; i--){ HeapAjust(A,i,len); } } void Swap(int &a,int &b){ int temp ; temp = a; a = b; b = temp; } //堆排序 void HeapSort(int A[],int len){ int i; BuildMaxHeap(A,len); for(i = len; i > 1; i--){ //将根节点(最大值)与最后一个节点进行数据交换,最大的元素就排在数组最后一个 Swap(A[1],A[i]); //数据交换后可能破坏了堆的特性,所以需要进行调整 HeapAjust(A,1,i-1); } } int main(){ //测试 int A[20]={0}; int i,len; scanf("%d",&len); for(i = 1; i <= len; i++){ scanf("%d",&A[i]); } HeapSort(A,len); //输出 for(i = 1; i <= len; i++){ printf("A[%d] = %d\n",i,A[i]); } return 0; }