前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >排序算法代码全实现

排序算法代码全实现

作者头像
对弈
发布2019-09-04 15:57:51
3970
发布2019-09-04 15:57:51
举报
文章被收录于专栏:用户3029758的专栏
代码语言:javascript
复制
#include<iostream>

using namespace std;
#define N 10000
void Print(int a[], const int len);//输出函数
void Sort1(int a[], const int len);//方法一:冒泡
void Sort2(int a[], const int len);//方法二:异或(只能整型)
void Sort3(int a[], const int len);//方法三:插入排序
void Sort4(int a[], const int len);//方法四:选择排序
void Sort5(int a[], const int len);//方法五:希尔排序
void Sort6(int a[], int begin, int end);//方法六:快速排序
void Sort7(int a[], const int len);//方法七:堆排序
void Sort8(int a[], const int len);//方法八:归并排序



int main()
{
int a[N],  len, NUM;
cout << "请输入你要使用的排序方:\n1:冒泡排序\n2:异或排序\n3:插入排序\n4:选择排序\n5:希尔排序\n6:快速排序\n7:堆排序\n8:归并排序" << endl;
cin >> NUM;
cout << "请输入排序个数:" << endl;
while (cin >> len)//多组输入
{
cout << "请输入这" << len << "个数:" << endl;
for (int i = 0; i < len; i++)
cin >> a[i];
if (NUM == 1)
if (NUM == 2)Sort2(a, len);
if (NUM == 3)Sort3(a, len);
if (NUM == 4)Sort4(a, len);
if (NUM == 5)Sort5(a, len);
if (NUM == 6)Sort6(a, 0, len - 1);
if (NUM == 7)Sort7(a, len);
if (NUM == 8)Sort8(a, len);
Print(a, len);
cout << "想继续排序吗?想输入Y/y,不想输入N/n:" << endl;
char Y;
cin >> Y;
if (Y == 'N' || Y == 'n')
break;
cout << "请输入你要使用的排序方:\n1:冒泡排序\n2:异或排序\n3:插入排序\n4:选择排序\n5:希尔排序\n6:快速排序\n7:堆排序\n8:归并排序" << endl;
cin >> NUM;
cout << "请输入这" << len << "个数:" << endl;
}
return 0;
}


void  Print(int a[], const int len)
{
cout << "用此方法排序后:" << endl;
for (int i = 0; i < len; i++)
{
if (i == 0)
cout << a[i];
else
cout << " " << a[i];
}
cout << "\n" << endl;
}



void Sort1(int a[], const int len)//方法一:冒泡
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
if (a[j] > a[j + 1])//每次把体格最大数沉底
{
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
}




void Sort2(int a[], const int len)//方法二:异或,缺点:只能整型
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
if (a[j] > a[j + 1])//其实和冒泡差不多
{
a[j] ^= a[j + 1];
a[j + 1] ^= a[j];
a[j] ^= a[j + 1];
}
}
}
}






void Sort3(int a[], const int len)//方法三:插入排序
{
for (int i = 1; i < len; i++)//从第二个开始
{
for (int j = 0; j < i; j++)//从第一个到i-1
{
if (a[j] > a[i])
{
int t = a[i];//先保存最后一个数
for (int k = i; k>j; k--)
{
a[k] = a[k - 1];//从k-1依次向后移动
}
a[j] = t;//保存的值放到j;
break;//插入之后退出
}
}
}

}







void Sort4(int a[], const int len)//方法四:选择排序
{
for (int i = 0; i < len - 1; i++)//选择最小的出来
{
int k = i;
for (int j = i + 1; j < len; j++)
{
if (a[j] < a[k])
{
k = j;//保存当前最小的位置
}
}
int t = a[i];
a[i] = a[k];
a[k] = t;
}
}






void Sort5(int a[], const int len)//方法五:希尔排序
{
//先分n组,组内排序,排序之后再分n/2组,排序。n/4...n/8......1
int d = len / 2;//分成d组
//a[0] a[0+d] a[0+2d] a[0+3d]
//a[1] a[1+d] a[1+2d] a[1+3d]
//...
while (d != 0)
{
for (int i = 0; i < d; i++)//排序d组
{
//第i组 a[i+0] a[i+d] a[i+2d] a[i+3d]
for (int j = i; j < len; j += d)//里面组内可以用其他排序
{                             //这里一选择排序为例子
int k = j;
for (int m = j + d; m < len; m += d)
{
if (a[m] < a[k])//找最小元素
{
k = m;
}
}
int t = a[j];//交换
a[j] = a[k];
a[k] = t;
}
}
d /= 2;
}
}






void Sort6(int a[], int belenin, int end)//方法六:快速排序
{
int Part(int a[], int belenin, int end);//声明排序函数
//数组分为两部分,放左右两边,分别对两部分进行排序
//然后两部分里面再分为两个子部分,依此类推,像递归一样
if (belenin >= end)
return;//不需要排序
int k = Part(a, belenin, end);
Sort6(a, belenin, k - 1);
Sort6(a, k + 1, end);
}


int Part(int a[], int belenin, int end)//方法六的一个调用排序函数
{
int k = belenin;//选择开头
//a[belenin]放到a[i]和 a[j]之间
//左边是i,右边是j
//从左往右 找一个比a[belenin]小的数字
//从右往左 找一个比a[belenin]大的数字
int i = belenin, j = end;
while (i < j)//当i==j的时候 i就是a[belenin]应该在的位置
{
while (i < j&&a[j] >= a[belenin])j--; //a[j]右边数字都要大于等于a[belenin]
while (i < j&&a[i] <= a[belenin])i++;//a[i]右边数字都要小于等于a[belenin]
int t = a[i];//交换a[i]和a[j]
a[i] = a[j];
a[j] = t;
}
//交换a[belenin]和a[i]
int t = a[belenin];
a[belenin] = a[i];
a[i] = t;
return i;

}




/*


堆的结构类似于完全二叉树,每个结点的值都小于或者等于其左右孩子结点的值,或者每个节点的值都大于或等于其左右孩子的值


堆排序过程将待排序的序列构造成一个堆,选出堆中最大的移走,再把剩余的元素调整成堆,找出最大的再移走,重复直至有序


来看一下实现*/


//堆排序
void Sort7(int a[], const int len)
{
int i;
void Heapify(int a[], const int first, int end);//声明排序函数
//初始化堆,从最后一个父节点开始
for (i = len / 2 - 1; i >= 0; --i){
Heapify(a, i, len);
}
//从堆中的取出最大的元素再调整堆
for (i = len - 1; i > 0; --i){
int temp = a[i];
a[i] = a[0];
a[0] = temp;
//调整成堆
Heapify(a, 0, i);
}
}
//再看 调整成堆的函数


void Heapify(int a[], const int first, int end)//声明方法七中的一部分
{
int father = first;
int son = father * 2 + 1;
while (son < end){
if (son + 1 < end && a[son] < a[son + 1]) ++son;
//如果父节点大于子节点则表示调整完毕
if (a[father] > a[son]) break;
else {
//不然就交换父节点和子节点的元素
int temp = a[father];
a[father] = a[son];
a[son] = temp;
//父和子节点变成下一个要比较的位置
father = son;
son = 2 * father + 1;
}
}

}





void Sort8(int a[], const int len)
{
void Merlene(int a[], int relen[], int start, int end);//声明方法八的一部分
//创建一个同样长度的序列,用于临时存放
int reg[len];
Merlene(a, reg, 0, len - 1);
}


void Merlene(int a[], int relen[], int start, int end)
{
if (start >= end)return;
int len = end - start, mid = (len >> 1) + start;


//分成两部分
int start1 = start, end1 = mid;
int start2 = mid + 1, end2 = end;
//然后合并
Merlene(a, relen, start1, end1);
Merlene(a, relen, start2, end2);




int k = start;
//两个序列一一比较,哪的序列的元素小就放进relen序列里面,然后位置+1再与另一个序列原来位置的元素比较
//如此反复,可以把两个有序的序列合并成一个有序的序列
while (start1 <= end1 && start2 <= end2)
relen[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];


//然后这里是分情况,如果a2序列的已经全部都放进relen序列了然后跳出了循环
//那就表示a序列还有更大的元素(一个或多个)没有放进relen序列,所以这一步就是接着放
while (start1 <= end1)
relen[k++] = a[start1++];


//这一步和上面一样
while (start2 <= end2)
relen[k++] = a[start2++];
//把已经有序的relen序列放回a序列中
for (k = start; k <= end; k++)
a[k] = relen[k];

}

声明:本文为原创,作者为 对弈,转载时请保留本声明及附带文章链接:http://www.duiyi.xyz/c%e5%ae%9e%e7%8e%b0%e9%9b%b7%e9%9c%86%e6%88%98%e6%9c%ba-45/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档