1、插入排序
(1)直接插入排序
void InsertSort(int A[],int len)
{
int temp;
for(int i=1;i<len;i++)
{
if(A[i]<A[i-1])
{
temp=A[i];
A[i]=A[i-1];
for(int j=i-2;temp<A[j];j--)
A[j+1]=A[j];
A[j+1]=temp;
}
}
}
(2)折半插入排序
void BInsertSort(int A[],int len)
{
int temp;
for(int i=1;i<len;i++)
{
int low=0;
int high=i-1;
temp=A[i];
while(low<=high)
{
int m=(low+high)/2;
if(temp<A[m])
high=m-1;
else
low=m+1;
}
for(int j=i-1;j>=high+1;j--)
A[j+1]=A[j];
A[high+1]=temp;
}
}
(3)2路插入排序
TInsertSort(int A[],int len)
{
int *D=new int[len];
D[0]=A[0];
int first=0,last=0;
for(int i=1;i<len;i++)
{
if(A[i]>D[0])
{
int j=1;
while(j<=last&&A[i]>=D[j])
j++;
last++;
for(int k=last-1;k>=j;k--)
D[k+1]=D[k];
D[j]=A[i];
}
else
{
int m=len-1;
if(first==0)
{
D[len-1]=A[i];
first=len-1;
}
else
{
while(m>=first&&D[m]<=A[i])
m--;
first--;
for(int n=first+1;n<=m;n++)
D[n-1]=D[n];
D[m]=A[i];
}
}
}
for(i=0;i<len;i++)
A[i]=D[(first+i)%len];
delete []D;
}
(4)希尔排序
2、交换排序
(1)冒泡排序
void BubbleSort(int A[],int len)
{
int temp;
for(int i=1;i<len;i++)
for(int j=0;j<len-i;j++)
if(A[j]>A[j+1])
{
temp=A[j];
A[j]=A[j+1];
A[j+1]=temp;
}
}
(2)快速排序
(1)分解:把A[p..r]划分为两个(可能空)的子数组A[p ..q-1]和A[q+1 ..r],使得
A[p ..q-1] <= A[q] <= A[q+1 ..r]
(2)解决:通过递归调用快速排序,对子数组A[p ..q-1]和A[q+1 ..r]快速排序。
(3)合并:就地排序无需合并。
int Partition(int A[],int p,int r)
{
int i=p-1;
int temp;
for(int j=p;j<r;j++)
{
if(A[j]<A[r])
{
i++;
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
}
temp=A[i+1];
A[i+1]=A[r];
A[r]=temp;
return i+1;
}
void QuickSort(int A[],int p,int r)
{
if(p<r)
{
int q=Partition(A,p,r);
QuickSort(A,p,q-1);
QuickSort(A,q+1,r);
}
}