C++八大排序算法(二)
来源:互联网 发布:电话薄软件 编辑:程序博客网 时间:2024/06/06 04:08
紧接上次内容,把剩下四个排序算法贴上
快速排序
#include "iostream"using namespace std;int function(int a[],int left,int right) { int keyValue = a[left]; //每次把数组第一个元素设为标记值 while (left < right) { while (left < right && a[right] >= keyValue) right--; a[left] = a[right]; //从右往左,把比标记值小的记录移到低端 while (left < right && a[left] <= keyValue) left++; a[right] = a[left]; //从左往右,把比标记值大的记录移到高端 } a[left] = keyValue; //把标记值移到最后的空缺位 return left; //返回标记值的索引}void sort(int a[],int left,int right) { if (left < right) { int keyIndex = function(a,left,right); //取到索引作为分界位 sort(a,left,keyIndex-1); //索引左部递归排序 sort(a,keyIndex+1,right); //索引右部递归排序 }}int main() { int a[10] = {5,4,6,8,1,3,9,10,2,7}; sort(a,0,9); for(int i = 0;i < 10;i++) cout<<a[i]<<" "; cout<<endl; return 0;}
希尔排序
#include "iostream"using namespace std;void function(int a[],int n,int d) { for(int i = d;i < n;i++) { //从第一个子序列的第二个元素开始遍历 if(a[i] < a[i-d]) { //当该元素小于有序序列的末元素时,进行插入排序 int s = a[i]; //标记该元素 for(int j = i-d;j >= 0 && s < a[j] ;j -= d) //从有序序列尾元素向前循环,标记元素查找插入位置,并移动其余元素 a[j+d] = a[j]; a[j+d] = s; //插入标记元素 } }}void shell(int a[],int n) { int b[3] = {5,3,1}; //增量序列,最后一个元素必须为1 for(int i = 0;i < 3;i++) function(a,n,b[i]);}int main() { int a[10] = {5,9,7,8,2,4,3,1,10,6}; shell(a,10); for(int i = 0;i < 10;i++) cout<<a[i]<<" "; cout<<endl; return 0;}
堆排序
#include "iostream"using namespace std;void function(int a[],int s,int m) { int i; int key = a[s]; for(i = 2 * s;i <= m;i *= 2) { //沿值较大的孩子结点向下筛选 if(i < m && a[i] < a[i+1]) //i为值较大的记录的下标 ++i; if(key > a[i]) //key应插入在位置s上 break; a[s] = a[i]; s = i; } a[s] = key; //插入}void heap(int a[],int n) { int i; for(i = n / 2;i > 0;--i) //把a[1]~a[11]建成大顶堆 function(a,i,n); for(i = n;i > 1;--i) { int s = a[1]; //将堆顶记录和当前未经排序子序列a[1]~a[i]中最后一个记录进行交换 a[1] = a[i]; a[i] = s; function(a,1,i-1); //将a[1]~a[i-1]重新调整为大顶堆 }}int main() { int a[11] = {0,2,5,6,7,9,1,3,10,4,8};//为了配合二叉树性质,左子树结点序号为父结点序号的两倍,故a[0]没有任何意义,待排序序列为a[1]~a[11] heap(a,10); for(int i = 1;i < 11;i++) cout<<a[i]<<" "; cout<<endl; return 0;}
归并排序
#include "iostream"using namespace std;void function(int a[], int l, int m, int r) { int n1 = m-l+1; int n2 = r-m; int *L = new int[n1]; //定义动态数组,长度为传入数组左部 int *R = new int[n2]; //定义动态数组,长度为传入数组右部 int i,j,k; for(i = 0;i < n1;i++) //赋值左数组 L[i] = a[l+i]; for(j = 0;j < n2;j++) //赋值右数组 R[j] = a[m+j+1]; for(i = 0,j = 0,k = l;i < n1 && j < n2 && k <= r;k++) { //比较左数组和右数组元素大小,由小到大赋值给a if(L[i] < R[j]) a[k] = L[i++]; else a[k] = R[j++]; } if(i < n1) { //若左数组有剩余,则依次写到a数组尾部 for(;k <= r;k++) a[k] = L[i++]; } if(j < n2) { //若右数组有剩余,则依次写到a数组尾部 for(;k <= r;k++) a[k] = R[j++]; } delete []L; //清除内存 delete []R;} void merge(int a[], int l, int r) { if (l < r) { int m = (l+r)/2; merge(a, l, m); //递归数组左部 merge(a, m+1, r); //递归数组右部 function(a, l, m, r); //归并排序 } } void main() { int a[10] = {5,6,7,8,1,3,4,2,9,10}; merge(a,0,9); for(int i = 0;i < 10;i++) cout<<a[i]<<" "; cout<<endl;}
终。
0 0
- 八大排序算法之二希尔排序(C语言)
- 八大排序算法(二)
- 八大排序算法(二)希尔排序
- C++八大排序算法(二)
- 八大排序算法之(二)插入排序 希尔排序
- 八大排序(二)
- C/C++ 八大排序算法
- 八大排序算法C实现
- 八大排序算法代码C
- 八大排序算法(二) 折半插入排序
- 八大排序算法之一直接插入排序(C语言)
- 八大种必知排序算法(二) 选择排序,插入排序,希尔算法(续)
- 八大排序算法总结之二(简单选择算法,堆排序,归并排序,基数排序)
- 八大种必知排序算法(二) 选择排序,插入排序,希尔算法
- 八大排序算法总结之二(简单选择算法,堆排序,归并排序,基数排序)
- 八大排序算法(转载)
- 八大排序算法(一)
- 八大排序算法(图文)
- java中的反射技术
- C语言求一元二次函数的解
- Win7 64位+VS2013 OpenCV 3.1.0安装配置
- 第九周OJ(5)大帆玩英雄联盟
- 设计模式学习新体会
- C++八大排序算法(二)
- C语言冒泡排序
- android中view使用背景shape显示不出圆角
- QQ企业邮箱设置IMAP、POP3/SMTP及其SSL加密方式
- Tempter of the Bone (深搜+剪枝)
- Javascript笔记
- 初识无人机
- c++ 实现数学表达式解析
- C语言求二进制中1的个数