void swap(int a[],int i,int j)
{
int tmp;
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
void print(int a[],int len)
{
int i;
for(i=0;i<len;i++)
printf("%3d",a[i]);
printf("\n");
}
void Bubble_sort(int a[],int len)//优化冒泡排序
{
int i,j;
int flag=FALSE;//FALSE代表序列依旧为乱序
for(i=1;i<=len-1&&flag==FALSE;i++)
{
flag=TRUE;
for(j=0;j<=len-1-i;j++)
{
if(a[j]>a[j+1])
{
swap(a,j,j+1);
flag=FALSE;
}
}
}
}
void Select_sort(int a[],int len)//选择排序
{
int i,j,min;
for(i=1;i<=len-1;i++)
{
min=i-1;
for(j=i;j<=len-1;j++)
{
if(a[min]>a[j])
min=j;
}
if(min!=i-1)
swap(a,min,i-1);
}
}
void Insert_sort(int a[],int len)//插入排序
{
int i,j,new;
for(i=1;i<=len-1;i++)
{
new=a[i];
for(j=i-1;j>=0;j--)
{
if(a[j]>new)
a[j+1]=a[j];
else break;
}
a[j+1]=new;
}
}
void Shell_sort(int a[],int len)//希尔排序
{
int gap=len,i,j;
do
{
gap=gap/3+1;
for(i=gap;i<len;i++)
{
int new=a[i];
for(j=i-gap;j>=0;j-=gap)
{
if(new<a[j])
a[j+gap]=a[j];
else break;
}
a[j+gap]=new;
}
}while(gap>1);
}
void quickSort(int keys[],int n,int begin,int end)//快速排序
{
if(begin>=0 && begin<n && end>=0 && end<n && begin<end)
{
int i=begin,j=end;
int vot=keys[i];
while(i!=j)
{
while(i<j && vot<=keys[j])
j--;
if(i<j)
keys[i++]=keys[j];
while(i<j && keys[i]<=vot)
i++;
if(i<j)
keys[j--]=keys[i];
}
keys[i]=vot;
printf("%d .. %d ,vot=%d\n", begin,end,vot);
print(keys,n);
quickSort(keys,n,begin,j-1);
quickSort(keys,n,i+1,end);
}
}
void sift_minheap(int keys[],int n,int begin,int end)//堆调整 最小堆
{
int parent=begin,child=2*parent+1;
int value=keys[parent];
while(child<=end)
{
if(child<end && keys[child]>keys[child+1])
child++;
if(value>keys[child])
{
keys[parent]=keys[child];
parent=child;
child=2*parent+1;
}
else break;
}
keys[parent]=value;
printf("sift %d .. %d \n", begin,end);
print(keys,n);
}
void heapSort_down(int keys[],int n) //堆排序
{
for(int i=n/2-1;i>=0;i--)
sift_minheap(keys,n,i,n-1);
for(int i=n-1;i>0;i--)
{
swap(keys,0,i);
sift_minheap(keys,n,0,i-1);
}
}