#include<stdio.h>
#include<stdlib.h>
//冒泡排序 1
void BubbleSort(int s[],int n)
{
int i,j;
for(i=1;i<n;i++)
for(j=1;j<=n-i;j++)
if(s[j-1]>s[j])
{
int temp=s[j-1];
s[j-1]=s[j];
s[j]=temp;
}
}
//希尔排序 2
void shellSort(int s[],int n)
{
int i,j,k,gap;
for(gap=n/2;gap>0;gap=gap/2)
for(i=0;i<gap;i++)
{
for (j=i+gap;j<n;j+=gap)
if(s[j-gap]>s[j])
{
int temp=s[j];
k=j-gap;
while(k>=0&& s[k]>temp)
{
s[k+gap]=s[k];
k=k-gap;
}
s[k+gap]=temp;
}
}
}
//直接插入3
void InsertSort(int s[],int n)
{
int i,j;
for(i=1;i<n;i++)
if(s[i]<s[i-1])
{
int temp=s[i];
int k=i-1;
while(k>=0&&s[k]>temp)
s[k+1]=s[k--];
s[k+1]=temp;
}
}
//简单选择 4
void SelectSort(int s[],int n)
{
int i,j;
for(i=0;i<n;i++)
{
int k=i;
for(j=i+1;j<n;j++)
if(s[j]<s[k]) k=j;
if(k!=i)
{
int temp=s[i];
s[i]=s[k];
s[k]=temp;
}
}
}
//快速排序 5
void QuickSort(int s[],int low,int high)
{
int i,j,pivotkey;
if(low<high)
{
pivotkey=s[low];i=low;j=high;
while(i<j){
while(i<j&&s[j]>=pivotkey) j--;
if(i<j)
s[i++]=s[j];
while(i<j&&s[i]<=pivotkey) i++;
if(i<j)
s[j--]=s[i];
}
s[i]=pivotkey;
QuickSort(s,low,i-1);
QuickSort(s,i+1,high);
}
}
//归并排序6(将两个或两个以上的有序文件合并成一个有序文件)
// data1[s..m]和data1[m+1..n]归并为有序的data2[s..n]
void Merge(int data1[],int data2[],int s,int m,int n)
{
int i,k;
for(i=m+1,k=s;s<=m&&i<=n;k++)
{
if(data1[s]<data1[i]) data2[k]=data1[s++];
else data2[k]=data1[i++];
}
while(s<=m)
{
data2[k++]=data1[s++];
}
while(i<=n)
{
data2[k++]=data1[i++];
}
}
//将data1[s..t]归并排序为data2[s..t]
void MSort(int data1[],int data2[],int s,int t)
{
int m,*temp;
if(s==t) data2[s]=data1[s];
else{
temp=(int *)malloc((t-s+1)*sizeof(int));
m=(s+t)/2;
MSort(data1,temp,s,m);
MSort(data1,temp,m+1,t);
Merge(temp,data2,s,m,t);
free(temp);
}
}
int main()
{
printf("请选择排序方法 \n 0. 退出\n 1. 冒泡排序\n 2. 希尔排序\n 3. 直接插入排序\n 4. 简单选择\n 5. 快速排序\n 6. 归并排序 \n");
int key;
printf("\n--------------------------------------------------\n");
printf("请输入选择:\n");
while(scanf("%d",&key)){
int s[]={2,5,4,3,6,7,8,1};
switch(key)
{
case 0:
return 0; break;
case 1:
BubbleSort(s,8);printf("冒泡排序:"); break;
case 2:
shellSort(s,7);printf("希尔排序:");break;
case 3:
InsertSort(s,8);printf("直接插入排序:");break;
case 4:
SelectSort(s,8);printf("简单选择:");break;
case 5:
QuickSort(s,0,8);printf("快速排序:");break;
case 6:
MSort(s,s,0,8);printf("归并排序:");break;
default:
printf("请输入正确的选择!"); continue;break;
}
for(int i=0;i<8;i++)
printf("%d ",s[i]);
printf("\n--------------------------------------------------\n");
printf("请输入选择:\n");
}
return 0;
}
运行结果: