堆排序
堆排序
堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
既然是堆排序,自然需要先建立一个堆,而建堆的核心内容是调整堆,使二叉树满足堆的定义(每个节点的值都不大于其父节点的值)。接下来就是调堆和循环调堆,具体参见堆排序。
参考代码
C语言
/* 版本一 */ #include<stdio.h> #include<stdlib.h> void swap(int*a,int*b) { int temp; temp=*a; *a=*b; *b=temp; } void select_sort(int A[],int n) { register int i,j,min,m; for(i=0;i<n-1;i++) { min=i;//查找最小值 for(j=i+1;j<n;j++) { if(A[min]>A[j]) { min=j; } } if(min!=i) { swap(&A[min],&A[i]); printf("第%d趟排序结果为:\n",i+1); for(m=0;m<n;m++) { if(m>0) { printf(""); } printf("%d",A[m]); } printf("\n"); } } } int main(void) { int n; while(scanf("%d",&n)!=EOF) /* VS2013等版本中需使用scanf_s(),VC6.0中使用scanf() */ { int i; int*A=(int*)malloc(sizeof(int)*n); for(i=0;i<n;i++) { scanf("%d",&A[i]); } select_sort(A,n); printf("最终排序结果为:\n"); for(i=0;i<n;i++) { if(i>0){ printf(""); } printf("%d",A[i]); } printf("\n"); } return 0; } /* 版本二 */ #include <stdio.h> #include <math.h> #define MAX_SIZE 101 #define SWAP(x, y, t) ((t) = (x), (x) = (y), (y) = (t)) void sort(int[], int); /* selection sort */ void main(void) { int i, n; int list[MAX_SIZE]; printf("Enter the number of numbers to generate: "); scanf_s("%d", &n); if (n < 1 || n > MAX_SIZE){ fprintf(stderr, "Improper value of n\n"); exit(1); } for (i = 0; i < n; i++){ /* randomly generate numbers */ list[i] = rand() * 1000; printf("%d ", list[i]); } sort(list, n); printf("\n Sorted array:\n"); for (i = 0; i < n; i++) /* print out sorted numbers */ printf("%d ", list[i]); printf("\n"); } void sort(int list[], int n) { int i, j, min, temp; for (i = 0; i < n - 1; i++){ min = i; for (j = i + 1; j < n; j++) if (list[j] < list[min]) min = j; SWAP(list[i], list[min], temp); } }
C#
static void(int[]group) { int temp; int pos=0; for(int i=0;i< group.Length-1;i++) { pos=i; for(intj=i+1;j<group.Length;j++) { if(group[j]<group[pos]) { pos=j; } }//第i个数与最小的数group[pos]交换 temp=group[i]; group[i]=group[pos]; group[pos]=temp; } }
C
void select_sort(int*a,int n) { register int i,j,min,t; for(i=0;i<n-1;i++) { min=i;//查找最小值 for(j=i+1;j<n;j++) if(a[min]>a[j]) min=j;//交换 if(min!=i) { t=a[min]; a[min]=a[i]; a[i]=t; } } }
c++
#include<iostream> #include<time.h> #include<iomanip> using namespace std; const int N=10; int main() { int a[N],i,j,temp,b; srand(time(NULL)); for(i=0;i<N;i++) a[i]=rand()%100; for(i=0;i<N;i++) cout<<setw(3)<<a[i]; cout<<endl; for(i=0;i<N-1;i++) { temp=i; for(j=i+1;j<N;j++) { if(a[temp]>a[j]) temp=j; } if(i!=temp) { b=a[temp]; a[temp]=a[i]; a[i]=b;} } for(i=0;i<N;i++) cout<<setw(3)<<a[i]; cout<<endl; }