【问题描述】从标准输入中输入一组整数,按照以下标号选择对应的排序方法实现排序。
1.冒泡排序
2.简单选择排序
3. 直接插入排序
4. 快速排序
5. 折半插入排序
6. 希尔排序(增量选取5,3,1)
7. 2-路插入排序
8. 堆排序
9.基数排序
10.归并排序
【输入形式】
先从标准输入读取整数的个数,然后第二行开始输入各个整数,整数之间以一个空格分隔。
第三行输入排序方法的选项标号
【样例输入】
13
50 38 30 64 58 40 10 73 70 50 60 100 35
2
【样例输出】
10 30 35 38 40 50 50 58 60 64 70 73 100
【样例说明】
13为待排序数组元素个数,第二行依次输入13个整数,第三行输入2表示采用简单选择排序法。
输出递增有序的结果。
注:本题测试样例共10组,顺序对应以上10种排序方法。
【运行结果如下】
【代码如下】
#include<iostream>
using namespace std;
#define MAXSIZE 20
typedef struct
{
int r[MAXSIZE+1];
int length;
}SqList;
void InitList(SqList &L)
{
cin>>L.length;
for(int i=1; i<=L.length; i++)
cin>>L.r[i];
}
void Sort_Bubbling(SqList &L)
{
//冒泡排序
int temp;
bool flat=true;
for(int i=1; i<L.length; i++)
{
for(int j=1; j<=L.length-i; j++)
{
if(L.r[j] > L.r[j+1]){
temp = L.r[j];
L.r[j] = L.r[j+1];
L.r[j+1] = temp;
flat = false; //发生交换
}//if
}
if(flat) return;
}//for
}
void Sort_Select(SqList &L)
{
//简单选择排序
int temp;
for(int i=1; i<L.length; i++)
{
int pos = i; //最小值位置
int min = L.r[i]; //最小值
for(int j=pos; j<L.length; j++)
if(L.r[j+1] < min){
pos = j+1;
min = L.r[j+1];
}
temp = L.r[pos];
L.r[pos] = L.r[i];
L.r[i] = temp;
}//for
}
void Sort_Insert(SqList &L)
{
//直接插入排序
int i,j;
for(i=2; i<=L.length; i++)
if(L.r[i] < L.r[i-1])
{
L.r[0] = L.r[i]; //哨兵
for(j=i-1; (j>0) && (L.r[j]>L.r[0]); j--)
L.r[j+1] = L.r[j]; //记录后移
L.r[j+1] = L.r[0]; //插入
}//if
}
int Partition(SqList &L,int low,int high)
{
int key;
key = L.r[low]; //中轴关键字key
while(low<high){
while(low<high && L.r[high] >= key )
high--;
if(low<high)
L.r[low++] = L.r[high];
while(low<high && L.r[low] <= key )
low++;
if(low<high)
L.r[high--] = L.r[low];
}
L.r[low] = key;
return low;
}
void Sort_Quick(SqList &L,int low,int high)
{
//快速排序
int pos;
if (low < high){
pos = Partition(L,low,high);
Sort_Quick(L,low,pos-1);
Sort_Quick(L,pos+1,high);
}
}
void Sort_Shell(SqList &L,int dk)
{
//希尔排序
int i,j;
for(i=dk+1; i<=L.length; i++)
if(L.r[i] < L.r[i-1])
{
L.r[0] = L.r[i]; //哨兵
for(j=i-dk; (j>0) && (L.r[j]>L.r[0]); j=j-dk)
L.r[j+dk] = L.r[j]; //记录后移
L.r[j+dk] = L.r[0]; //插入
}//if
}
//void Merge(SqList L1,SqList &L2,int i,int m,int n)
//{
// int j=m+1;
// int k=i;
// while(i<=m && j<=n){
// if(L1.r[i] < L1.r[j])
// L2.r[k++] = L1.r[i++];
// else
// L2.r[k++] = L1.r[j++];
// }
// if(i<=m){
//
// }
// if(j<=n)
//}
//void Sort_Merger(SqList L1,SqList &L2,int s,int t)
//{
// //归并排序
// SqList L3;
// if(s == t)
// L2.r[s] = L1.r[s];
// else
// {
// int m = (s+t)/2;
// Sort_Merger(L1,L3,s,m);
// Sort_Merger(L1,L3,m+1,t);
// Merge(L3,L,s,m,t);
// }
//
//}
void Output(SqList &L)
{
for(int i=1; i<=L.length; i++)
cout<<L.r[i]<<" ";
cout<<endl;
}
int main()
{
SqList L;
InitList(L);
int t;
cin>>t;
switch(t)
{
case 1://冒泡排序
Sort_Bubbling(L);
break;
case 2://简单选择排序
Sort_Select(L);
break;
case 3://直接插入排序
Sort_Insert(L);
break;
case 4://快速排序
Sort_Quick(L,1,L.length); //1为低位,L.length为高位
break;
// case 5://折半插入快速排序
// Sort_InHalf(L);
// break;
case 6://希尔排序
Sort_Shell(L,5);
Sort_Shell(L,3);
Sort_Shell(L,1);
break;
// case 7://2-路插入排序
// Sort_Two_Routes(L);
// break;
// case 8://堆排序
// Sort_Heap(L);
// break;
// case 9://基数排序
// Sort_Base(L);
// break;
// case 10://归并排序
// Sort_Merger(L,L,1,L.length);
// break;
default:
Sort_Bubbling(L);
}
Output(L);
return 0;
}
本文章仅供学习和参考!
欢迎交流~