各种排序算法实现(以数组为数据结构)(可运行):直接插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序
#include<stdio.h>
#include<stdbool.h>
void StraightInsertSort1(int a[],int n){
int i,j,temp;
for(i=1;i<n;i++)
{
if(a[i]<a[i-1])
{
temp=a[i];
for(j=i-1;j>=0&&a[j]>temp;j--)
{
a[j+1]=a[j];
}
a[j+1]=temp;
}
}
}
void StraightInsertSort2(int a[],int n)
{
int i,j;
for(i=2;i<=n;i++)
{
if(a[i]<a[i-1]){
a[0]=a[i];
for(j=i-1;a[0]<a[j];j--)
a[j+1]=a[j];
a[j+1]=a[0];
}
}
}
void BinaryInsertSort(int a[],int n)
{
int i,j,low,high,mid;
for(i=2;i<=n;i++)
{
a[0]=a[i];
low=1;
high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[0]>=a[mid])
low=mid+1;
else
high=mid-1;
}
for(j=i-1;j>=low;j--)
a[j+1]=a[j];
a[low]=a[0];
}
}
void ShellInsert(int a[],int n,int gap)
{
int i,j;
for(i=gap+1;i<=n;i++)
{
if(a[i]<a[i-gap])
{
a[0]=a[i];
for(j=i-gap;j>0&&a[0]<a[j];j=j-gap)
{
a[j+gap]=a[j];
}
a[j+gap]=a[0];
}
}
}
void ShellSort(int a[],int gaps[],int n,int t)
{
int k;
for(k=0;k<t;k++)
ShellInsert(a,n,gaps[k]);
}
void BubbleSort(int a[],int n)
{
int i,j;
for(i=1;i<=n-1;i++)
{
bool flag=false;
for(j=2;j<=n-i+1;j++)
{
if(a[j-1]>a[j])
{
a[0]=a[j-1];
a[j-1]=a[j];
a[j]=a[0];
}
flag=true;
}
if(flag==false)
break;
}
}
int Partition(int a[],int low,int high)
{
a[0]=a[low];
while(low<high)
{
while(low<high&&a[high]>=a[0])
high--;
a[low]=a[high];
while(low<high&&a[low]<=a[0])
low++;
a[high]=a[low];
}
a[low]=a[0];
return low;
}
void QuickSort(int a[],int low,int high)
{
if(low<high)
{
int pivotpos=Partition(a,low,high);
QuickSort(a,low,pivotpos-1);
QuickSort(a,pivotpos+1,high);
}
}
void SelectSort(int a[],int n)
{
int i,j;
for(i=1;i<=n;i++)
{
int min=i;
for(j=i+1;j<=n;j++)
{
if(a[j]<a[min])
min=j;
}
if(min!=i)
{
a[0]=a[min];
a[min]=a[i];
a[i]=a[0];
}
}
}
void HeadAdjust(int a[],int k,int len)
{
int i;
a[0]=a[k];
for(i=2*k;i<=len;i=i*2)
{
if(i<len&&a[i]<a[i+1])
i++;
if(a[0]>=a[i])
break;
else{
a[k]=a[i];
k=i;
}
}
a[k]=a[0];
}
void BuildMaxHeap(int a[],int len)
{
int i;
for(i=len/2;i>=1;i--)
{
HeadAdjust(a,i,len);
}
}
void HeapSort(int a[],int len)
{
int i;
BuildMaxHeap(a,len);
for(i=len;i>1;i--)
{
a[0]=a[1];
a[1]=a[i];
a[i]=a[0];
HeadAdjust(a,1,i-1);
}
}
void Merge(int a[],int low,int mid,int high)
{
int i,j,k,b[100];
for(i=low;i<=high;i++)
b[i]=a[i];
i=low;
j=mid+1;
for(k=i;i<=mid&&j<=high;k++)
{
if(b[i]<=b[j])
a[k]=b[i++];
else
a[k]=b[j++];
}
while(i<=mid)
a[k++]=b[i++];
while(j<=high)
a[k++]=b[j++];
}
void MergeSort(int a[],int low,int high)
{
if(low<high)
{
int mid=(low+high)/2;
MergeSort(a,low,mid);
MergeSort(a,mid+1,high);
Merge(a,low,mid,high);
}
}
int main(){
int array[10];
int i,enter=1,select;
int a[11];
printf("请输入要排序的序列(10个元素):\n");
for(i=1;i<=10;i++)
scanf("%d",&a[i]);
while(enter!=9)
{
printf("\n\n\t\t****************排序*************\n");
printf("\t\t 1、直接插入排序\n");
printf("\t\t 2、折半插入排序\n");
printf("\t\t 3、希尔排序\n");
printf("\t\t 4、冒泡排序\n");
printf("\t\t 5、快速排序\n");
printf("\t\t 6、简单选择排序\n");
printf("\t\t 7、堆排序\n");
printf("\t\t 8、归并排序\n");
printf("\t\t 9、退出系统\n");
printf("请输入排序序号:");
scanf("%d",&select);
switch(select)
{
case 1:
StraightInsertSort2(a,10);
break;
case 2:
BinaryInsertSort(a,10);
break;
case 3:{
int gap[]={4,2,1};
ShellSort(a,gap,10,3);
break;
}
case 4:
BubbleSort(a,10);
break;
case 5:
QuickSort(a,1,10);
break;
case 6:
SelectSort(a,10);
break;
case 7:
HeapSort(a,10);
case 8:
MergeSort(a,1,10);
}
printf("排序结果为:");
for(i=1;i<=10;i++)
printf("%d ",a[i]);
printf("\n");
printf("请选择是否退出:9:退出;其他:继续:");
scanf("%d",&enter);
}
return 0;
}
运行结果:
1、直接插入排序
2、折半插入排序
3、希尔排序
4、冒泡排序
5、快速排序
6、简单选择排序
7、堆排序
8、归并排序