//
//常用的排序算法,简单实现
//
/
#include <stdio.h>
#include <stdlib.h>
void InsertSort(int * data,int length);
void print_array(int * data,int length);
void bubble_sort(int * data,int length);
void shell_sort(int * data,int length,int *dk,int t);
void quick_sort(int * data,int length);
void select_sort(int * data,int length);
void merge_sort(int *source,int *dest,int s,int t);
void heap_sort(int * data,int length);
/
int main(void)
{
int arr[10]={1,8,6,9,7,2,4,3,0,5};
int dest[10];
// InsertSort(arr,10);
int dk[1]={1};
// shell_sort(arr,10,dk,1);
// bubble_sort(arr,10);
// quick_sort(arr,10);
//select_sort(arr,10);
//heap_sort(arr,10);
merge_sort(arr,dest,1,10);
print_array(arr,10);
}
//
//归并排序
//
/
void merge(int *source,int *dest,int i,int m,int n)
{
int j=m+1,k=i;
for(;j<=n && i<=m;++k)
{
if(source[i-1]<source[j-1])
{
dest[k-1]=source[i-1];
i++;
}
else
{
dest[k-1]=source[j-1];
j++;
}
}
while(i<=m)
{
dest[k-1]=source[i-1];
k++;
i++;
}
while(j<=n)
{
dest[k-1]=source[j-1];
k++;
j++;
}
}
void merge_sort(int *source,int *dest,int s,int t)
{
if(s==t) dest[s-1]=source[s-1];
else
{
int mid=(s+t)/2;
merge_sort(source,dest,s,mid);
merge_sort(source,dest,mid+1,t);
merge(source,dest,s,mid,t);
}
}
//
//堆排序
//
/
void heap_adjust(int * data,int s,int m)
{
int temp=data[s-1];
for(int j=2*s;j<=m;j*=2)
{
if(j<m && data[j-1]<data[j]) ++j;
if(data[s-1]>data[j-1]) break;
data[s-1]=data[j-1];
s=j;
}
data[s-1]=temp;
}
void heap_sort(int * data,int length)
{
int i;
for( i=length/2;i>0;i--)
{
heap_adjust(data,i,length);
}
for(i=length;i>1;i--)
{
int temp=data[i-1];
data[i-1]=data[0];
data[0]=temp;
heap_adjust(data,1,i-1);
}
}
//
//选择排序
//
/
void select_sort(int * data,int length)
{
int index;
for(int i=0;i<length;i++)
{
index =i;
for(int j=i+1;j<length;j++)
{
if(data[j]<data[index]) index=j;
}
int temp=data[index];
data[index]=data[i];
data[i]=temp;
}
}
//
//快速排序
//
/
int partition(int * data,int low,int high)
{
int middle=data[low];
while(low<high)
{
while(low<high && data[high]>=middle) high--;
data[low]=data[high];
while(low<high && data[low]<=middle) low++;
data[high]=data[low];
}
data[low]=middle;
return low;
}
void qsort(int * data,int low,int high)
{
if(low<high)
{
int mid=partition(data,low,high);
qsort(data,low,mid-1);
qsort(data,mid+1,high);
}
}
void quick_sort(int * data,int length)
{
qsort(data,0,length-1);
}
//
//冒泡排序
//
/
void bubble_sort(int * data,int length)
{
bool ischange=true;
for(int i=length-1;i>0 && ischange ;i--)
{
ischange=false;
for(int j=0;j<i;j++)
{
if(data[j+1]<data[j])
{
ischange=true;
int temp=data[j+1];
data[j+1]=data[j];
data[j]=temp;
}
}
}
}
//
//插入排序
//
/
void InsertSort(int * data,int length)
{
if(length>0)
{
for(int i=1;i<length;i++)
{
for(int j=i;j>0;j--)
{
if(data[j]<data[j-1])
{
int temp=data[j-1];
data[j-1]=data[j];
data[j]=temp;
}
}
}
}
}
//
//希尔排序
//
/
void shell_insert(int * data,int length,int dk)
{
/*
for(int i=0;i<dk;i++)
{
int position=((length-i-1)/dk)*dk+i;
for(int j=i+dk;j<=position;j+=dk)
{
for(int t=j;t>i;t-=dk)
{
if(data[t]<data[t-dk])
{
int temp=data[t-dk];
data[t-dk]=data[t];
data[t]=temp;
}
}
}
}
*/
for(int i=dk;i<length;i++)
{
for(int j=i;j>=0;j-=dk)
{
if(data[j+dk]<data[j])
{
int temp=data[j+dk];
data[j+dk]=data[j];
data[j]=temp;
}
}
}
}
void shell_sort(int * data,int length,int *dk,int t)
{
for(int i=0;i<t;i++)
{
shell_insert(data,length,dk[i]);
}
}
//
//打印数组
//
/
void print_array(int * data,int length)
{
int *pBegin=data,*pEnd=data+10;
for(;pBegin!=pEnd;) printf("%d\n",*pBegin++);
system("pause");
}