主要实现了一下算法:
1.插入排序
2.冒泡排序
3.快速排序
4.希尔排序
5.堆排序
代码如下:
#include<stdio.h>
#include<stdlib.h>
void creat(int a[],int n);
void show(int a[],int n);
void swap(int *a,int *b);
void bubbleSort(int a[],int n);
void insertSort(int a[],int n);
void quickSort(int a[],int low,int high);
void qusort(int a[],int l,int r);
void selectSort(int a[],int n);
void shellSort(int a[],int n);
void shellSort3(int a[],int n);
//28 13 2 1 8 2 9 18 23 19 //测试数据
void CreateMenu();
void Sift(int a[],int low,int high); //调整堆
void HeapSort(int a[],int n); //堆排序
void Reverse(int a[],int n); //对数组进行调整,从1开始存储
void ShowHeap(int a[],int n); //输出堆
void main()
{
int a[20];
int i=0,select=1;
char ch;
while(select)
{
system("cls");
CreateMenu();
scanf("%d",&select);
switch(select)
{
case 1:
creat(a,10);
break;
case 2:
insertSort(a,10);
show(a,10);
break;
case 3:
bubbleSort(a,10);
show(a,10);
break;
case 4:
quickSort(a,0,9);
//qusort(a,0,9);
show(a,10);
break;
case 5:
shellSort(a,10);
show(a,10);
break;
case 6:
Reverse(a,10);
HeapSort(a,10);
ShowHeap(a,10);
break;
}
if(select ==1 ||select ==2||select ==3||select ==4||select ==5|| select ==6)
{
printf("输入回车继续:");
scanf("%c%*c",&ch);
}
}
//insertSort(a,10);
//bubbleSort(a,10);
// quickSort(a,0,9);
//qusort(a,0,9);
//selectSort(a,10);
// shellSort(a,10);
// show(a,10);
}
void CreateMenu()
{
char *menu[]= {
"\t\t\t排序\n",
"\t\t1.输入要排序的数组:\n",
"\t\t2.插入排序\n",
"\t\t3.冒泡排序\n",
"\t\t4.快速排序\n",
"\t\t5.希尔排序\n",
"\t\t6.堆排序\n",
"\t\t7.请输入(1_6):"
};
int i;
for(i=0;i<8;i++)
printf("%s",menu[i]);
}
void creat(int a[],int n)
{
int i;
printf("Please input %d numbers!\n",n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
}
void show(int a[],int n)
{
int i;
printf("after sort the num is :\n");
for(i=0;i<n;i++)
printf("%4d",a[i]);
printf("\n");
}
void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
/*
插入排序
*/
void insertSort(int a[],int n)
{
int i,j,temp;
for(i=1;i<=n;i++)
{
j=i-1;
temp= a[i]; //设置岗哨
while(temp<a[j] && j>=0) //找对地方然后后移
{
a[j+1]= a[j];
j--;
}
a[j+1]=temp;
}
}
/*
冒泡排序
排n趟,每一趟两两比较
*/
void bubbleSort(int a[],int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n-i;j++)
{
if(a[j]>a[j+1])
{
swap(&a[j],&a[j+1]);
}
}
}
void quickSort(int a[],int low,int high) //以第一个元素作为比较元素
{
if(low<high)
{
int i =low , j = high;
int key = a[low];
//下面完成一趟排序,小于key的放在左边,大于key的放在右边
while(i<j)
{
while(i<j&&a[j]>key) //从右往左找到第一个小于key的值
j--;
if(i<j)
{
a[i] = a[j];
i++;
}
while(i<j&&a[i]<key) //从左向右找到第一个大于key的值
i++;
if(i<j)
{
a[j]=a[i];
j--;
}
}
a[i]= key; //key放在最终的位置
quickSort(a, low,i-1);
quickSort(a, i+1,high);
}
}
void qusort(int a[],int l,int r) //以中间元素作为比较元素
{
int i=l,j=r,mid=a[(l+r)>>1];
// int mid = a[l];
while (i<j) //找出左边大于中间的值,右边小于中间的值,进行交换
{
while (a[i]<mid) i++;
while (mid<a[j]) j--;
if (i<=j)
{
swap(&a[i],&a[j]);
i++; j--;
}
}
if (l<j) qusort(a,l,j);
if (i<r) qusort(a,i,r);
}
//选择排序,每一趟选出最小的和第i个进行交换
void selectSort(int a[],int n)
{
int i,j,index;
for(i=0;i<n;i++)
{
index=i;
for(j=i+1;j<n;j++)
{
if(a[j]<a[index])
{
index=j; //记录最小的index
}
}
swap(&a[i],&a[index]);
}
}
void shellSort(int a[],int n)
{
int d,i,j;
for(d=n/2;d>=1;d/=2) //缩量去一半,整个数组n/2组
{
for(i=d;i<n;i++)
{
int e=a[i];
for(j=i-d;j>=0&&e<a[j];j-=d) //每组2个数据进行插入查找
// a[j+d]=a[j];
//a[j+d]=e;
swap(&a[j+d],&a[j]);
}
}
}
void shellSort3(int a[],int n)
{
int i,j;
for(i=5;i>=1;i-=2)
{
for(j=i;j<n;j++)
{
if(a[j-i]>a[j])
swap(&a[j-i],&a[i]);
}
}
}
void Sift(int a[],int low,int high) //从low到high进行大根调整,数组从1开始存储
{
int i=low,j=2*i;
int temp =a[i];
while(j<=high) //向下进行调整
{
if(j<high && a[j]<a[j+1]) //若右孩子较大,则j指向右孩子
j++;
if(temp<a[j]) //进行调整
{
a[i] = a[j];
i=j;
j=2*i;
}
else
break;
}
a[i] =temp; //将调整的值放入最终位置
}
void HeapSort(int a[],int n) //堆排序
{
int i;
int temp;
for(i=n/2;i>=1;i--)
Sift(a,i,n); //开始建堆
for(i=n;i>=2;i--) //将根节点放入最后位置
{
temp = a[1];
a[1] =a[i];
a[i] = temp;
Sift(a,1,i-1);
}
}
void Reverse(int a[],int n)
{
int i;
for(i=n+1;i>0;i--)
{
a[i] = a[i-1];
}
}
void ShowHeap(int a[],int n)
{
int i;
for(i=1;i<=n;i++)
printf("%4d",a[i]);
}
完美测试!