利用分治法的排序算法比较
来源:互联网 发布:长春学历网络教育 编辑:程序博客网 时间:2024/06/06 04:40
1.快速排序
代码:
int partition(int a[],int p,int r){int key = a[r];int i = p;int j = p;int t;while(j<r){if(a[j] <= key){t = a[i];a[i] = a[j];a[j] = t;i++;}j++;}t = a[i];a[i] = a[r];a[r] = t;return i;} void quick(int a[],int p, int r){if(p<r){int i = partition(a,p,r);quick(a,p,i-1);quick(a,i+1,r);}}
快速排序的核心就是一个关键值,先确定一个key值,然后遍历整个数组,让数组分为两个部分,左边部分小于key值,右边部分大于key值(两部分元素数目可能不同,实际上经常不同);
然后就是递归该做的事了。
2.归并排序
排序2个元素的数组,比排序4个元素的数组简单吧,排序4个元素的数组,比排序八个元素的数组简单吧。归并排序干的就是这类的事情。将数组一步一步的变小,再合并;
void merge(int list1[], int list1Size,int list2[], int list2Size){int *list;int i=0,j=0,k=0;list = (int *)malloc(sizeof(int)*(list1Size+list2Size));while(i<list1Size && j<list2Size)list[k++] = list1[i]<list2[j]?list1[i++]:list2[j++];while(i<list1Size)list[k++] = list1[i++];while(j<list2Size)list[k++] = list2[j++];i=-1; while(++i<k){list1[i] = list[i];} free(list);}void mergesort(int list[],int listsize){if(listsize > 1){int i,j;int *list1,*list2;i = listsize/2;j = listsize -i;list1 = list;list2 = list+i;mergesort(list1,i);mergesort(list2,j);merge(list1,i,list2,j);}}
3.堆排序
堆排序利用了二叉树的性质,这里得提到一个性质最大堆,最大堆就是根节点大于等于 所有子节点。
先将整个数组处理为一个最大堆,然后交换首尾元素,再将第0位到第n-1位,处理为最大堆,再交换0号元素和n-1号元素。一直处理到0位;
void Heap_MAX(int a[], int i, int length){int nchild = 2*i+1;int ntemp;for(;2*i+1<length;i = nchild){nchild = 2*i+1;if(nchild<length-1 && a[nchild] <a[nchild+1] ){nchild++;} if(a[nchild]>a[i]){ntemp = a[nchild];a[nchild] = a[i];a[i] = ntemp;}else{break;}} }void heapsort(int a[],int length){int i,temp;for(i=length/2-1;i>=0;i--){Heap_MAX(a,i,length);}for(i=length-1;i>0;i--){temp = a[i];a[i] = a[0];a[0] = temp;Heap_MAX(a,0,i);}}
0 0
- 利用分治法的排序算法比较
- 排序算法之分治法
- 分治法-----快速排序算法
- 排序算法:插入排序\分治法
- 【算法】分治法(快速排序,归并排序)
- 排序算法--快速排序(分治法)
- 算法导论-分治法-合并排序的Python&C++实现
- 分治法,动态规划,贪心算法比较
- [算法学习笔记]又一个采用分治法的排序算法----快速排序算法
- 排序算法的比较~~
- 排序算法的比较
- 排序算法的比较
- 排序算法的比较
- 排序算法的比较
- 排序算法的比较
- 排序算法的比较
- 排序算法的比较
- 排序算法的比较
- Zookeeper场景实践:(8) 分布式队列
- 八大排序算法
- 2014ICPC World final A题(未解之谜)
- Codeforces Round #157 (Div. 1) C. Little Elephant and LCM (数学、dp)
- 【设计模式笔记】面向对象编程的理解
- 利用分治法的排序算法比较
- 2014.11.1题解(4)——杭电2037
- NOIP复习篇———动态规划
- 归并排序学习笔记
- shell 高级操作、正则表达
- UNIX编程的操作系统基础知识(进程篇)
- 黑马程序员——FileReader和FileWriter
- 运用C#编程通过OPC方式实现PC机与西门子PLC通讯 --异步通讯篇
- STM LDM汇编批量加载指令的错误用法