最近又重新温习了一下排序算法,自己重新写了一下代码:
1.插入排序
void InsertSort(int a[],int N)
{
int i,j;
int tmp;
for(i = 1 ;i < N;i++)
{
tmp = a[i];
for(j = i-1;j >=0 ;j--)
{
if(a[j] < tmp)
{
break;
}
a[j+1] = a[j];
}
a[j+1] = tmp;
}
}
2. shell排序(希尔排序)
增量选择了5,3,1
void InsertSortByInc(int a[],int N, int inc)
{
int i,j;
int tmp;
for(i = inc; i < N; i++)
{
tmp = a[i];
for(j = i - inc; (j >=0 && a[j]>tmp); j-=inc)
{
a[j+inc] = a[j];
}
a[j+inc] = tmp;
}
}
void ShellSort(int a[],int N)
{
int inc;
for(inc = 5; inc >= 1 ;inc = inc - 2)
{
InsertSortByInc(a,N,inc);
}
}
3.归并排序(merge sort)
void Merge(int a[],int c[],int lt,int cr,int rt)
{
int i,j;
int k;
i = lt;
j = cr+1;
k = lt;
while(i<=cr && j<=rt)
{
if(a[i] < a[j])
{
c[k] = a[i];
i++;
}
else
{
c[k] = a[j];
j++;
}
k++;
}
for(;i<=cr;i++)
c[k++] = a[i];
for(;j<=rt;j++)
c[k++] = a[j];
for(i = lt;i<=rt;i++)
a[i] = c[i];
}
void MergeSortExc(int a[],int c[],int left,int right)
{
int center;
if(left < right)
{
center = (left+right)/2;
MergeSortExc(a,c,left,center);
MergeSortExc(a,c,center+1,right);
Merge(a,c,left,center,right);
}
}
void MergeSort(int a[], int N)
{
int c[N];
MergeSortExc(a,c,0,N-1);
}
4.heap sort(堆排序)
void down(int a[],int i,int N)
{
int index;
int tmp;
tmp = a[i];
index = 2*i+1;
if(index > N-1)
return;
do
{
if((index+1 <= N-1) && (a[index+1] > a[index]))
index = index+1;
if(a[index] <= tmp)
break;
a[i] = a[index];
i = index;
index = 2*i+1;
}while(index<=N-1);
a[i] = tmp;
}
void BuildHeap(int a[],int N)
{
int i;
for(i = (N-1)/2;i>=0;i--)
{
down(a,i,N);
}
}
void HeapSort(int a[],int N)
{
int i;
int tmp;
BuildHeap(a,N);
for(i = (N-1);i>0;i--)
{
tmp = a[0];
a[0] = a[i];
a[i] = tmp;
down(a,0,i);
}
}