1. 快速排序算法
思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分的关键字比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。代码如下:
void QuickSort(int arr[],int len)
{
QSort(arr,1,len);
}
void QSort(int arr[],int low,int high)
{
int privot;
if(low<high)
{
privot=Partition(arr,low,high);
QSort(arr,low,privot-1);
QSort(arr,privot+1,high);
}
}
int Partition(int arr[],int low,int high)
{
int privotkey;
privotkey=arr[low];
while(low<high)
{
while(low<high&&arr[high]>=privotkey)
{
high--;
}
swap(arr,low,high);
while(low<high&&arr[low]<=privotkey)
{
low++;
}
swap(arr,low,high);
}
return low;
}
快速排序算法的时间复杂度为O(n2),即二次方。
2. 希尔排序
思想:希尔排序的思想就在于设置了一个增量,比如增量初始化为len(假设len=10),每次为in=in/3+1,那么我们在第一次的时候的时候就用arr[1]与arr[5]作比较,如果大于,则交换,然后比较arr[2]和arr[6]的值,.........直至增量小于等于1时结束。代码如下:
void ShellSort(int arr[],int len)
{
int i,j;
int in=len;
do
{
in=in/3+1; //增量
for(i=in+1;i<len;i++)
{
if(arr[i]<arr[i-in])
{
arr[0]=arr[i]; //暂存在arr[0]中
for(j=i-in;j>0&&arr[0]<arr[j];j-=in)
{
arr[j+in]=arr[j]; //相隔增量的位置的记录值都需要比较一下,以找到正确的插入位置
}
arr[j+in]=arr[0];
}
}
}while(in>1)
}
希尔排序的时间复杂度为O(n(3/2)),即n的3/2次方。