#include <stdio.h>
#include <stdlib.h>
void swap(int k[],int lo,int hi)
{
int temp;
temp=k[lo];
k[lo]=k[hi];
k[hi]=temp;
}
/*
**冒泡排序
void BubbleSort1(int k[],int n)
{
int i,j,temp,count1=0,count2=0;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
count1++;
if(k[i]>k[j])
{
count2++;
temp=k[j];
k[j]=k[i];
k[i]=temp;
}
}
}
printf("总共进行了%d次比较,进行了%d次移动.\n",count1,count2);
}
void BubbleSort2(int k[],int n)
{
int i,j,temp,count1=0,count2=0;
for(i=0;i<n-1;i++)
{
for(j=n-1;j>i;j--)
{
count1++;
if(k[j-1]>k[j])
{
count2++;
temp=k[j-1];
k[j-1]=k[j];
k[j]=temp;
}
}
}
printf("总共进行了%d次比较,进行了%d次移动.\n",count1,count2);
}
*/
void BubbleSort(int k[],int n)
{
int i,j,temp,count1=0,count2=0,flag;
flag=1;
for(i=0;i<n-1&&flag;i++)
{
for(j=n-1;j>i;j--)
{
count1++;
flag=0;
if(k[j-1]>k[j])
{
count2++;
temp=k[j-1];
k[j-1]=k[j];
k[j]=temp;
flag=1;
}
}
}
printf("总共进行了%d次比较,进行了%d次移动.\n",count1,count2);
}
/*
**选择排序
*/
void SelectSort(int k[],int n)
{
int i,j,min,temp,count1=0,count2=0;
for(i=0;i<n-1;i++)
{
min=i;
for(j=i+1;j<n;j++)
{
count1++;
if(k[j]<k[min])
{
min=j;
}
}
if(min!=i)
{
count2++;
temp=k[min];
k[min]=k[i];
k[i]=temp;
}
}
printf("总共进行了%d次比较,进行了%d次移动.\n",count1,count2);
}
/*
**插入排序
*/
void InsertSort(int k[],int n)
{
int i,j,temp;
for(i=1;i<n;i++)
{
for(j=i;j>0;j--)
{
if(k[j]<k[j-1])
{
temp=k[j];
k[j]=k[j-1];
k[j-1]=temp;
}
}
}
}
/*
**希尔排序
*/
void ShellSort(int k[],int n)
{
int i,j,temp;
int h=1;
while(h<n/3)
h=3*h+1;
while(h>=1)
{
for(i=h;i<n;i++)
{
for(j=i;j>=h;j-=h)
{
if(k[j]<k[j-h])
{
temp=k[j];
k[j]=k[j-h];
k[j-h]=temp;
}
}
}
h=h/3;
}
}
/*
**堆排序
*/
void HeapAdjust(int k[],int s,int n)
{
int i,temp;
temp=k[s];
for(i=2*s;i<=n;i*=2)
{
if(i<n&&k[i]<k[i+1])
{
i++;
}
if(temp>=k[i])
{
break;
}
k[s]=k[i];
s=i;
}
k[s]=temp;
}
void HeapSort(int k[],int n)
{
int i;
for(i=n/2;i>0;i--)
{
HeapAdjust(k,i,n);
}
for(i=n;i>1;i--)
{
swap(k,1,i);
HeapAdjust(k,1,i-1);
}
}
/*
**归并排序
*/
#define MAXSIZE 10
void merge(int a[],int lo,int mid,int hi)
{
int i=lo,j=mid+1;
int aux[MAXSIZE],k;
for(k=lo;k<=hi;k++)
{
aux[k]=a[k];
}
for(k=lo;k<=hi;k++)
{
if(i>mid)
a[k]=aux[j++];
else if(j>hi)
a[k]=aux[i++];
else if(aux[j]<aux[i])
a[k]=aux[j++];
else
a[k]=aux[i++];
}
}
void MergeSort(int a[],int lo,int hi)
{
int mid=lo+(hi-lo)/2;
if(lo<hi)
{
MergeSort(a,lo,mid);
MergeSort(a,mid+1,hi);
merge(a,lo,mid,hi);
}
}
/*
**归并排序迭代
void MergeSort_1(int k[],int n)
{
int i,left_min,left_max,right_min,right_max,next;
int *temp=(int *)malloc(n*sizeof(int));
for(i=1;i<n;i*=2)
{
for(left_min=0;left_min<n-i;left_min=right_max)
{
right_min=left_max=left_min+i;
right_max=left_max+i;
if(right_max>n)
{
right_max=n;
}
next=0;
while(left_min<left_max&&right_min<right_max)
{
if(k[left_min]<k[right_min])
{
temp[next++]=k[left_min++];
}
else
{
temp[next++]=k[right_min++];
}
}
while(left_min<left_max)
{
k[--right_min]=k[--left_min];
}
while(next>0)
{
k[--right_min]=temp[--next];
}
}
}
}
*/
/*
** 快速排序
*/
#define MAX_LENGTH_INSERT_SORT 7
void ISort(int k[],int lo,int hi)
{
InsertSort(k+lo,hi-lo+1);
}
int partition(int k[],int lo,int hi)
{
int point;
int mid=lo+(hi-lo)/2;
if(k[lo]>k[hi])
{
swap(k,lo,hi);
}
if(k[mid]>k[hi])
{
swap(k,mid,hi);
}
if(k[mid]>k[lo])
{
swap(k,mid,lo);
}
point=k[lo];
while(lo<hi)
{
while(lo<hi&&k[hi]>=point)
{
hi--;
}
k[lo]=k[hi];
while(lo<hi&&k[lo]<=point)
{
lo++;
}
k[hi]=k[lo];
}
k[lo]=point;
return lo;
}
void Qsort(int k[],int lo,int hi)
{
int point;
if(hi-lo>MAX_LENGTH_INSERT_SORT)
{
while(lo<hi){
point=partition(k,lo,hi);
if(point-lo<hi-point)
{
Qsort(k,lo,point-1);
lo=point+1;
}
else
{
Qsort(k,point+1,hi);
hi=point-1;
}
}
}
else
{
ISort(k,lo,hi);
}
}
void QuickSort(int k[],int n)
{
Qsort(k,0,n-1);
}
/*
**打印结果
*/
void print(int a[])
{
int i;
printf("排序后的结果是:");
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
void print_heap(int a[])
{
int i;
printf("排序后的结果是:");
for(i=1;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
/*
**打印排序选项
*/
void printSortItems()
{
printf("please select items:\n");
puts("1.BubbleSort 2.QuickSort");
puts("3.SelectSort 4.HeapSort");
puts("5.InsertSort 6.ShellSort");
puts("7.MergeSort 8.Quit");
}
int main()
{
int a[10]={5,2,6,0,3,9,1,7,4,8};
char c;
/*
**堆排序从1开始
*/
int b[10]={-1,5,2,6,0,3,9,1,7,4};
printSortItems();
while((scanf("%c",&c))==1)
{
getchar();
switch(c)
{
case '1':
BubbleSort(a,10);
print(a);
printSortItems();
break;
case '2':
QuickSort(a,10);
print(a);
printSortItems();
break;
case '3':
SelectSort(a,10);
print(a);
printSortItems();
break;
case '4':
HeapSort(b,9);
print_heap(a);
printSortItems();
break;
case '5':
InsertSort(a,10);
print(a);
printSortItems();
break;
case '6':
ShellSort(a,10);
print(a);
printSortItems();
break;
case '7':
MergeSort(a,0,9);
print(a);
printSortItems();
break;
case '8':
exit(0);
default:
fputs("input error!\n",stderr);
printSortItems();
break;
}
}
return 0;
}