#include<stdio.h>
#define LeftChild(i) (2*(i)+1)
void InsertionSort(int *pData,int n)
{
int temp, i, j;
for(i=1; i<n; i++)
{
temp=pData[i];
for(j=i-1; j>=0&&temp<pData[j]; j--)
{
pData[j+1]=pData[j];
}
pData[j+1]=temp;
}
}
void ShellSort(int *pData, int n, int delta)
{
int temp, i, j;
for(i=delta; i<n; i++)
{
temp=pData[i];
for(j=i-delta; j>=0&&temp<pData[j]; j=j-delta)
pData[j+delta]=pData[j];
pData[j+delta]=temp;
}
}
int partition(int a[], int i, int j)
{
int temp=a[i];
while(i<j)
{
while(a[j]>=temp&&i<j)
j--;
if(i<j)
a[i++]=a[j];
while(a[i]<=temp&&i<j)
i++;
if(i<j)
a[j--]=a[i];
}
a[i]=temp;
return i;
}
void QuickSort(int a[], int i, int j)
{
int k;
if(i<j)
{
k=partition(a,i,j);
QuickSort(a,i,k-1);
QuickSort(a,k+1,j);
}
}
void BuildDown(int a[], int n, int rootIndex)
{
int root=a[rootIndex];
int childIndex=LeftChild(rootIndex);
while(childIndex<n)
{
if(childIndex!=n-1&&a[childIndex+1]>a[childIndex])
childIndex++;
if(root<a[childIndex])
{
a[rootIndex]=a[childIndex];
rootIndex=childIndex;
childIndex=LeftChild(rootIndex);
}
else
break;
}
a[rootIndex]=root;
}
void HeapSort(int a[],int n)
{
int temp, rootIndex, i;
for(rootIndex= (n-2)/2; rootIndex>=0; rootIndex--)
BuildDown(a, n, rootIndex);
for(i= n-1; i>=0; i--)
{
temp=a[0];
a[0]=a[i];
a[i]=temp;
BuildDown(a, i, 0);
}
}
int main()
{
printf("*******直接插入排序如下*******\n\n");
int data[100], n=0, x=0;
printf("请输入要排序数字的个数:\n");
scanf("%d",&n);
printf("请输入元素(中间按空格隔开):");
for(x=0; x<n; x++)
{
scanf("%d",&data[x]);
}
InsertionSort(data,n);
printf("排序完成:");
for(x=0; x<n; x++)
{
printf("%d ",data[x]);
}
printf("\n\n*******(这是分割线)*******");
printf("\n\n\n");
printf("*******希尔排序如下*******\n");
printf("请输入要排序数字的个数:\n");
scanf("%d",&n);
printf("请输入元素(中间按空格隔开):");
for(x=0; x<n; x++)
{
scanf("%d",&data[x]);
}
int increment=n/3;
for(;increment>0;increment=increment/3)
{
ShellSort(data, n, increment);
}
if(increment==0)
{
InsertionSort(data,n);
}
printf("排序完成:");
for(x=0; x<n; x++)
{
printf("%d ",data[x]);
}
printf("\n\n*******(这是分割线)*******");
printf("\n\n\n");
printf("*******快速排序如下*******\n");
printf("请输入要排序数字的个数:\n");
scanf("%d",&n);
printf("请输入元素(中间按空格隔开):");
for(x=0; x<n; x++)
{
scanf("%d",&data[x]);
}
QuickSort(data, 0, n-1);
printf("排序完成:");
for(x=0; x<n; x++)
{
printf("%d ",data[x]);
}
printf("\n\n*******(这是分割线)*******");
printf("\n\n\n");
printf("*******堆排序如下*******\n");
printf("请输入要排序数字的个数:\n");
scanf("%d",&n);
printf("请输入元素(中间按空格隔开):");
for(x=0; x<n; x++)
{
scanf("%d",&data[x]);
}
HeapSort(data, n);
printf("排序完成:");
for(x=0; x<n; x++)
{
printf("%d ",data[x]);
}
return 0;
}