#include<stdio.h>
#include<stdlib.h>
#define M 20
#define ElemType int
typedef struct
{
ElemType *data;
int Length;
int ListSize;
}SqList;
void disp1(int *a,int n)
{ int i;
printf(" 排序前:*****\n");
for(i=1;i<=n;i++)
printf(" %3d",a[i]);
printf("\n");
}
void disp2(int *a,int n)
{ int i;
printf(" 排序后:*****\n");
for(i=1;i<=n;i++)
printf(" %3d",a[i]);
a[0]=-1;
printf("\n");
}
void create(int *a,int *b,int *n)
{int i;
printf("输入待排序的元素总个数:\n");
scanf("%d",n);
for(i=1;i<=*n;i++)
{ printf("输入第 %d个元素:\n",i);
scanf("%d",&a[i]);
b[i]=a[i];
}
a[0]=b[0]=0;
}
void insertsort(int *a,int n)
{ int i,j;
for(i=2 ; i <= n ; i++)
{ a[0] = a[i];
for(j=i-1; a[0]< a[j]; j-- )
a[j+1] = a[j];
a[j+1] = a[0];
}
}
void ShellInsert(int *a,int dk,int n){
int i,j;
for(i=dk+1;i<=n; ++ i)
if(a[i] <= a[i-dk])
{ a[0]=a[i];
for( j=i-dk; j>0 &&(a[0]<a[j]); j=j-dk)
a[j+dk]=a[j];
a[j+dk]=a[0];
}}
void xiersort(int *a,int n)//希尔排序
{
int d[3] = {5, 3, 1};
{
for (int k = 0; k < 3; ++k)
ShellInsert(a,d[k],n); //增量为d[k]的一趟插入排序
}
}
void maopaosort(int *a,int n)//冒泡
{ int i,j,change,t;
for(i=1;i<n;i++)
{ change=0;
for(j=1;j<=n-i;j++)
if(a[j]>a[j+1])
{ t=a[j];
a[j]=a[j+1];
a[j+1]=t;
change=1;
}
if(change==0)
break;
}
}
int quicksort(int *a,int low, int high)//快速排序
{ int i=low,j=high;
a[0]=a[i];
while(i<j)
{ while(i<j&&a[j]>=a[0]) --j;
a[i]=a[j];
while(i<j&&a[i]<=a[0]) ++i;
a[j]=a[i];
}
a[i]=a[0];
//quicksort(a,1,i-1);
//quicksort(a,i+1,n);
return i;
}
void quick(int *a,int low,int high)
{
int r;
if (low<high)
{ r=quicksort(a,low,high);
quick(a,low,r-1);
quick(a,r+1,high);
}
}
void jiandansort(int *a,int n)//简单选择排序
{ int i,j,t;
int min; //待排序数组中最小值的下标
for (i = 0; i < n - 1; ++i)//i = 0,第一次待排数组为所有数
{
min = i;
for (j = i + 1; j < n; ++j)
{
if (a[j] < a[min])
{
min = j;//
}
}
//将a[i]与a[min]交换位置
t = a[i];
a[i] = a[min];
a[min] = t;
}
}
void adjust(int *a,int low, int top)
{ int j;
a[0]=a[low];
for(j=2*low;j<=top;j*=2)
{ if(j<top&&a[j]>a[j+1])
j++;
if(a[j]<a[0])
{ a[low]=a[j];
low=j;
}
}
a[low]=a[0];
}
int maximum(int *a,int n)
{
int i=1,m;
m=a[1];
while(i<=n)
{
if(a[i]>m) m=a[i];
i++;
}
return m;
}
void counting_sort(int *a,int n)
{
int i,m,*c,*b;
m=maximum(a,n);
// printf("%d",m);
c=(int *)malloc(sizeof(int)*(m+1)); //建立一个辅助数组,存储计数信息
b=(int *)malloc(sizeof(int)*(n+1)); //用于存放排好序的数组
for(i=0;i<=m;i++)
c[i]=0;
for(i=1;i<=n;i++) //A[i]作为下标,将对应的c数组置位
c[a[i]]++;
for(i=1;i<=m;i++)
c[i]=c[i]+c[i-1]; //c[A[i]]中存储了小于或等于A[i]的元素的个数
for(i=1;i<=n;i++)
{
b[c[a[i]]]=a[i];
c[a[i]]--;
}
disp2(b,n);
free(c);
}
int Partition(ElemType *a, int n)
{
int i = 1, j = n;
ElemType pivot = a[j];
while (i < j) {
while (i < j && a[i] <= pivot) i++;
if (i < j) a[j] = a[i];
while (i < j && a[j] >= pivot) j--;
if (i < j) a[i] = a[j];
}
a[i] = pivot;
return i;
}
void mnulist()
{ printf("\n 1--------- 插入排序 ");
printf("\n 2--------- 希尔排序");
printf("\n 3---------冒泡排序");
printf("\n 4--------- 快速排序");
printf("\n 5-------- 简单选择排序");
printf("\n 6---------- 堆排序");
printf("\n 7--------- 创建排序表");
printf("\n 8--------- 计数排序");
printf("\n 9--------- 将K放在正确的位置");
printf("\n 0--------- 退出\n");
}
void main( )
{int a[M+1],b[M+1],n=0,i;
int K=100;
create(a,b,&n);
while (K!=0)
{ mnulist();
printf("请输入功能选项:");
scanf("%d",&K);
for(i=1;i<=n;i++)
a[i]=b[i];
if (K==1)
{disp1(a,n);
insertsort(a,n) ;
disp2(a,n); }
if (K==2)
{ disp1(a,n);
xiersort(a,n);
disp2(a,n); }
if (K==3)
{ disp1(a,n);
maopaosort(a,n);
disp2(a,n); }
if (K==4)
{
disp1(a,n);
quick(a,1,n);
disp2(a,n);
}
if(K==8){
disp1(a,n);
counting_sort(a, n);
}
if(K==9){
disp1(a,n);
int p = Partition(a, n);
printf("Kn的正确位置是:%d",p);
}
}
}
代码-排序
于 2022-08-15 19:18:38 首次发布