堆排序
2015-12-03 10:57
218 查看
堆排序
堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即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 ,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; }
相关文章推荐
- java判断文件是否存在
- Linux中环境变量文件及配置
- 不用分布式方式,处理大量数据的问题
- css颜色编码对照大全
- android smali语法
- ubuntu14配置jdk1.7
- axis实现webservice服务
- 接口和内部类
- 常用网卡/收发器
- 【MongoDB系列】:MongoDB基础知识
- CSS属性的陷阱
- yii2 使用gii
- 品潮平台服务协议
- java war 打包、解压命令
- UISearchBar和UISearchDisplayController键盘bookmark.search等事件的方法
- LM-Sensors unable to load driver module
- WeixinJSBridge 微信
- 【Android】在android studio中使用assert
- fragment解析(二)
- 骑行应用开发《二》定位城市