求C++高手做一个排序系统,用C++做。(一定要是C++)!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求C++高手做一个排序系统,用C++做。(一定要是C++)!相关的知识,希望对你有一定的参考价值。
1 实现以下六种排序算法:Shell排序;Quiclk排序;锦标赛排序;堆排序;归并排序;基数排序;
2 主程序采用菜单形式;
3 最好能多写点注释;
就像这样,源码;
template<class T>
class stack
public:
;
#include<iostream>
using namespace std;
void main()
cout<<"栈式数据结构的实现"<<endl;
int i=1,k,value;
cout<<"\n栈操作练习:"<<endl;
arrstack<int>S(5);
cout<<"1------:入栈操作"<<endl;
cout<<"2------:出栈操作"<<endl;
cout<<"3------:清空操作"<<endl;
cout<<"4------:栈顶操作"<<endl;
cout<<"5------:退出操作"<<endl;
cout<<"\n请输入你的选择:"<<endl;
cin>>k;
while(k!=5)
switch(k)
case 1:cout<<"请输入数据,-1结束数据输入:"<<endl;
case 2: cout<<"请出栈:"<<endl;
case 3: S.clear();
case 4: S.Top(value);
break;
;
cout<<"\n栈操作练习:"<<endl;
cout<<"1------:入栈操作"<<endl;
cout<<"2------:出栈操作"<<endl;
cout<<"3------:清空操作"<<endl;
cout<
#define NUM 5 //无序表元素个数
#define MAX 1000 //元素最大值
using namespace std;
int list[NUM*10]=0; //存储无序表及排序结果
int merge_list[NUM*10]=0; //归并排序时用于存无序表
int merge_link[NUM*10]=0; //归并排序时辅助
void init();
void init_list(int);
void out(int[], int, int);
void swap(int, int);
//1 直接插入排序 -------------------------------------------------------
void insert_sort(int len)
int insertNum;
for (int i=0; i<len; i++)
insertNum = list[i]; // 待插入元素
int j = i;
while (j>0 && insertNum<list[j-1]) // 寻找插入位置
list[j] = list[j-1];
j--;
list[j] = insertNum;
//2 二分插入排序
void binary_insert_sort(int len)
int middle;
for (int i=0; i<len; i++)
int insertNum = list[i];
int left = 0;
int right = i-1;
while (left <= right) //二分法寻找插入位置
middle = (left + right)/2;
if (insertNum > list[middle]) left = middle+1;
else right = middle-1;
for (int j=i; j>left; j--) list[j] = list[j-1];
list[left] = insertNum;
//3 希尔排序------------------------------------------------------------
void shell_sort(int len)
int insertNum;
int gap = len/2; //初始增量
while (gap) //当gap>=1
for (int i=gap; i<len; i++) //对gap间隔子序列进行插入排序
insertNum = list[i]; //待插入元素
int j = i;
while (j>=gap && insertNum<list[j-gap])
//寻找插入位置
list[j] = list[j-gap];
j -= gap;
list[j] = insertNum; //插入
gap = gap/2; //缩小增量
//4 直接选择排序 -------------------------------------------------------
void select_sort(int len)
int k;
for (int i=0; i<len; i++)
k = i;
for (int j=i+1; j<len; j++) // 找最小元素
if (list[j] < list[k]) k = j;
swap(i, k); // 将最小元素放入i位置
//5 堆排序-------------------------------------------------------------
// 堆的建立或调整
void filterDown(int current, int last)
int child = 2*current+1; //child为current的子女位置
int temp = list[current]; //暂存子树根结点
while (child <= last) //判断是否到最后结尾
if (child<last && list[child]<list[child+1]) child++;
//让child指向两子女中的大者
if (temp >= list[child]) break; //temp的关键码大则不做调整
else //否则子女中的大者上移
list[current] = list[child];
current = child;
child = 2*child+1;
list[current] = temp; //temp中暂存元素放到合适位置
void heap_sort(int len)
for (int i=(len-2)/2; i>=0; i--) filterDown(i, len-1);
//建立堆
for (i=len-1; i>0; i--)
swap(0, i);
filterDown(0, i-1); //不断调整堆为最大堆
//6 冒泡排序------------------------------------------------------------
void bubble_sort(int len)
for (int i=0; i<len; i++)
for (int j=i+1; j<len; j++)
if (list[i] > list[j]) swap(i, j);
//7 Shaker排序------------------------------------------------------------
void shaker_sort(int len)
int i, left = 0, right = len - 1,shift = 0;
while(left < right)
for(i = left; i < right; i++) //向右进行气泡排序
if(list[i] > list[i+1])
swap(i, i+1);
shift = i;
right = shift;
for(i = right; i > left; i--) //向左进行气泡排序
if(list[i] < list[i-1])
swap(i ,i-1);
shift = i;
left = shift;
//8 快速排序------------------------------------------------------------
void quick_sort(int left, int right)
int i = left;
int j = right;
int pivot = list[left];
while (i<j)
while (i<j && list[j]>=pivot) j--; //找到比基数小的元素
if(i < j) swap(i, j);
while (i<j && list[i]<=pivot) i++; //找到比基数大的元素
if(i < j) swap(i, j);
if (i!=left) quick_sort(left, i-1); //对list[left...i-1]排序
if (j!=right) quick_sort(j+1, right); //对list[j+1...right]排序
//9 归并排序:递归-----------------------------------------------------------
//具体方法:以merger_link[]提供链表功能。merger_link[i]对应在有序子序列中
//merger_list[i]后一个结点在原merger_list[]中的下标;
//merger_link[0]总是表示有序子序列开始的结点在merge_list[]中的下标;
//st1,st2为两个有序序列的第一个结点;
//将他们归并,并返回其第一个结点的下标,即merger_link[0]
int list_merge(int st1, int st2)
int k = 0, i = st1, j = st2;
while (i && j) //当两序列未检测完
if (merge_list[i] <= merge_list[j]) //将merge_list[i]和merge_list[j]
//中小的连接到merger_link[k]后
merge_link[k] = i;
k = i;
i = merge_link[i];
else
merge_link[k] = j;
k = j;
j = merge_link[j];
if (!i) merge_link[k] = j; //将剩余未检测完的merge_list[]
else merge_link[k] = i; //连接到merger_link[k]后
return merge_link[0];
int merge_sort(int left, int right)
if (left>=right) return left;
int middle = (left + right)/2;
//对左右两子序列进行归并
return list_merge(merge_sort(left,middle), merge_sort(middle+1,right));
//10 计数排序
void counting_sort(int len, int max)
int result[NUM]; //临时保存结果
int* mark = new int[max]; //标记无序表中元素
memset(mark, 0, max * sizeof(int));
for (int i = 0; i < len; i++) mark[list[i]]++;
//统计元素出现次数
for (i = 1; i < max; i++) mark[i] += mark[i - 1];
//计算元素在有序表中位置
for (i = len - 1; i >= 0; i--)
result[mark[list[i]] - 1] = list[i];//通过mark[]直接将list[i]
mark[list[i]]--; //有序存入result[]
delete []mark;
//转存到list以便输出结果
for (i=0; i<len; i++) list[i] = result[i];
//-------- 主过程-----------------------------------------------------
int main()
init();
int inp;
while (true)
cout<<"请选择: "; //选择排序方法
cin >> inp;
init_list(inp); //初始化无序表
switch(inp) //各种排序
case 1: insert_sort(NUM);break;
case 2: binary_insert_sort(NUM);break;
case 3: shell_sort(NUM);break;
case 4: select_sort(NUM);break;
case 5: heap_sort(NUM);break;
case 6: bubble_sort(NUM);break;
case 7: shaker_sort(NUM);break;
case 8: quick_sort(0, NUM-1);break;
case 9: merge_sort(1, NUM);break;
case 10:counting_sort(NUM, MAX);break;
case 0: exit(0);break;
cout<< "排序结果:"<<endl; //输出排序结果
if (inp!=9) out(list, 0, NUM);
else
int i = merge_link[0];
int j = 0;
while (i)
j++;
cout<<merge_list[i]<<" ";
i = merge_link[i];
if (j%18 == 0) cout <<endl;
cout <<endl;
return 0;
// 辅助方法---------------------------------------------------------------
// 初始化界面
void init()
cout <<endl;
cout << " 十种常用排序算法(升序)" <<endl;
cout << " ---------------------------------"<<endl;
cout << " 1. 直接插入排序" <<endl;
cout << " 2. 二分插入排序" <<endl;
cout << " 3. 希尔排序" <<endl;
cout << " 4. 直接选择排序" <<endl;
cout << " 5. 堆排序" <<endl;
cout << " 6. 冒泡排序" <<endl;
cout << " 7. Shaker排序" <<endl;
cout << " 8. 快速排序" <<endl;
cout << " 9. 归并排序" <<endl;
cout << " 10.计数排序" <<endl;
cout << " 0. 退出" <<endl;
cout << " ---------------------------------"<<endl;
//初始化无序表
void init_list(int inp)
if (inp == 0) return;
cout<<"待排序数列:"<<endl;
if (inp == 9) //为归并排序生成无序表
for (int i=1; i<=NUM; i++)
merge_list[i] = rand()%MAX;
merge_link[i] = 0;
out(merge_list,1,NUM);
else //为其他排序生成无序表
for (int i=0; i<NUM; i++) list[i]=rand()%MAX;
out(list, 0, NUM);
// 输出结果
void out(int result[], int st, int len)
for (int i=st; i<st+len; i++)
cout<< result[i] << " ";
if ((i+1)%18 == 0) cout<<endl;
cout <<endl;
//交换list[i]和list[j]
void swap(int i, int j)
int temp = list[i];
list[i] = list[j];
list[j] = temp;
参考技术A 我很懒,会也不帮你写 参考技术B 一楼说的对,这个要写老久了..你还要求主程程序采用菜单形式 参考技术C 好逗哦~ 参考技术D 一百分打发?不可能,写真的多挺辛苦的!黑屏程序都不错了!还界面…
C++归并排序求逆序对_模板
归并排序的思想就是对数组分别排序后合并,利用这个思想我们可以再合并是进行逆序对判断。只需要将归并排序做一些小的改动就可以实现求逆序对。
#include<iostream>
using namespace std;
const int N = 1e5 + 5;
int a[N],temp[N];
int n;
int cnt=0;//逆序对数量
void merge_sort(int l,int r) {
if (l >= r) {
return;
}
int mid = l + r >> 1;
merge_sort(l, mid);
merge_sort(mid + 1, r);
int i = l, j = mid + 1,k=0;
while (i <= mid && j <= r) {
if (a[i] < a[j]) temp[k++] = a[i++];
else {
temp[k++] = a[j++];
cnt += mid - i + 1;//记录逆序对
}
}
while (i <= mid) temp[k++] = a[i++];//清除余下的数
while (j <= r) temp[k++] = a[j++];//清除余下的数
for (int i = l, k = 0; i <= r; i++, k++)
a[i] = temp[k];
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
merge_sort(0,n-1);
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
cout << "Reverse order pair:"<<cnt << endl;
return 0;
}
以上是关于求C++高手做一个排序系统,用C++做。(一定要是C++)!的主要内容,如果未能解决你的问题,请参考以下文章
c++ 中啥样的指针是裸指针,参数可以是智能指针的引用吗,求高手举例指教
c++中怎么确定list 容器里的元素的位置 求高手解答 在线等答案