2021-11-07 排序方法(部分)

【问题描述】从标准输入中输入一组整数,按照以下标号选择对应的排序方法实现排序。

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; 
}

本文章仅供学习和参考!

欢迎交流~

Guess you like

Origin blog.csdn.net/m0_58489132/article/details/121191528