数据结构——堆排序和归并排序
来源:互联网 发布:手机海淘 知乎 编辑:程序博客网 时间:2024/05/21 10:31
这2种排序是几天前学的,现在把他们写在一起。具体的书上也有写。
堆排序的思路:
1.a[0]是不参与排序的,可以先把a[0]设成-1
2.对数组进行一次整体的调整(可以从n/2往前调整,也可以从n往前调整,因为不满足j<=high时不调整)
3.调整函数里,让a[2*i]和a[2*i+1]比较,较大的数与a[i]交换
4.由于最大的数已经被调整到了a[1],所以将a[1]与数组最后一个数交换,同时最后一个数的标志位减1
5.调整一次,使最大的数到a[1],回到步骤3,直到排序完毕
#include <stdio.h>#include <stdlib.h>#define N 1000000void swap(int *a,int *b){ int tmp; tmp=*a; *a=*b; *b=tmp;}void adjust_array(int a[],int low,int high){ int i=low,j=2*i; int tmp=a[i]; while(j<=high) { if(j<high && a[j]<a[j+1]) j++; if(tmp < a[j]) { a[i]=a[j]; i=j; j=2*i; } else break; } a[i]=tmp;}void heap_sort(int a[],int n){ int i,tmp; for(i=n/2;i>=1;i--) adjust_array(a,i,n); for(i=n;i>=2;i--) { swap(&a[i],&a[1]); adjust_array(a,1,i-1); }}void random_array(int a[],int n){ int i; for(i = 1 ; i < n ; i++ ) a[i]=random()%n;}int main(){ int i; int a[N]={-1}; //for(i=1;i<N;i++) // a[i]=100-i; random_array(a,N); //for(i=0;i<N;i++) // printf("%d\n",a[i]); //printf("\n"); heap_sort(a,N-1); for(i=0;i<N;i++) printf("%d\n",a[i]); return 0;}
归并排序就是先假设已经有了2组排序好的数据,然后再把这2组数据归并成1组有序的数据。如:{0,2,4,6}和{1,3,5,7}归并成{0,1,2,3,4,5,6,7}
#include <stdio.h>#include <stdlib.h>#include <string.h>#define N 1000000void swap(int* a,int* b){ int tmp; tmp=*a; *a=*b; *b=tmp;}void merge_sort(int *a,int low,int mid,int high){ int* a1; int i=low,j=mid+1,k=0; if(low==high) return; merge_sort(a,i,(i+mid)/2,mid); merge_sort(a,j,(j+high)/2,high); a1=(int*)malloc((high-low+1)*sizeof(int)); while( i<= mid && j<=high ) if(a[i] < a[j]) a1[k++]=a[i++]; else a1[k++]=a[j++]; while( i<= mid ) a1[k++]=a[i++]; while( j<= high ) a1[k++]=a[j++]; for(k=0,i=low;i<=high;k++,i++) a[i]=a1[k]; free(a1);}void random_array(int a[],int n){ int i; for(i = 1 ; i < n ; i++ ) a[i]=random()%n;}int main(){ int i; int a[N]={0};// for(i=0;i<N;i++)// a[i]=20-i; random_array(a,N); merge_sort(a,0,N/2,N-1); for(i=0;i<N;i++) printf("%d\n",a[i]); return 0;}
0 0
- 数据结构——堆排序和归并排序
- 数据结构(堆排序和归并排序)
- 数据结构 — 归并排序
- 数据结构 — 归并排序
- 堆排序和归并排序
- 堆排序和归并排序
- 堆排序和归并排序
- 归并排序和堆排序
- 堆排序和归并排序
- 数据结构 — 堆排序
- 排序3——堆排序,归并排序,快速排序
- 数据结构——归并排序
- 数据结构——归并排序
- 数据结构——归并排序
- 数据结构之排序——归并排序
- 数据结构面试之十一——排序2(归并、快速、堆排序)
- 数据结构6-排序算法(直接插入排序、希尔排序、快速排序、归并排序和堆排序)
- 基础数据结构算法_快速排序,堆排序,归并排序
- [C++]类和对象(三)
- 剑指offer:复杂链表的复制
- docker学习资料整理记录
- svn 莫名奇妙的认证失败
- 推荐TV内容
- 数据结构——堆排序和归并排序
- 自定义状态栏颜色与app保持一致
- 有关 CSS3 box-flex: 1
- android studio 预览(preview)窗口无法显示 怎么处理
- 原生JavaScript事件详解
- 软工视频小总结
- Collection集合和map集合的种类区分
- Redis Sentinel原理
- 2016秋《高速电路EDA设计》计数器FPGA电路实验