1.快速排序
该算法是一种运用分治思想的算法,它的主要思想是:有待排序数组S={d1,d2,d3,....dn},从中找出元素V,我们称之为划界元素,将剩下的元素中小于或等于V的元素移动到V的前面,将大于或等于V的元素移动到V的后面,这样V就找到了它的最终的排序位置,并将数组分为两个子数组S1和S2,然后利用递归,实现排序。
void qsort(int a[],int low,int high)
{
if(low>=high)
return;
int first=low;
int last=high;
int key=a[first];
while(first<last)
{
while(first<last&&a[last]>=key)
{
--last;}
a[first]=a[last];
while(first<last&&a[first]<=key)
{
++first;}
a[last]=a[first];
a[first]=key;
qsort(a,low,first-1);
qsort(a,first+1,high);
}
}
2.归并排序
归并算法充分体现了以“空间换时间”的思想,但它的时间复杂度较高。归并算法是很典型的运用分治思想的算法。归并,就是将两个或多个已经排序好的序列合并在一起,根据合并序列数目的多少,分为二路归并,多路归并。下面是二路归并:
合并函数:
template<typename datatype)void merge( datatype A[],datatype B[],datatype C[],int lengthA,int lengthB)
{
int i=0,j=0,counter=0;
while(counter<lengthA+lengthB)
{
if(A[i]>B[j])
{
C[counter]=B[j];
j++;
counter++;
}
else{
C[counter]=A[i];
i++;
counter++;
}
if(i==lengthA)
{
while(j<lengthB)
{
C[counter]=B[j];
j++;
counter++;}
}
else if(j==lengthB)
{
while(i<lengthA)
{
C[counter]=A[i];
i++;
counter++;}
}
}
}
归并排序算法:
template<typename datatype)void mergesort(datatype A[],int n)
{
if(n>1)
{
int i=n/2;
int j=n-n/2;
datatype B[n/2];
datatype C[n-n/2];
for(int k=0;k<i;k++)
B[k]=A[k];
for(int k=0;k<j;k++)
C[k]=A[k+i];
mergesort(B,i);
mergesort(C,j);
merge(B,C,A,i,j);
}
}
3.希尔排序
希尔排序算法是一种很独特的排序算法,采用一种增量序列的技术。在随机情况下,希尔排序算法的运行时间表现较优秀,但它不适用于链表结构。
希尔算法在排序过程中会借助一个序列gap1,gap2,gap3,.....,该序列被称为增量序列,希尔排序主要通过比较相距gapn间隔的元素的大小来进行排序,每趟排序比较所使用的间隔距随着排序的进行二减少,直到只比较相邻元素为止。
template<typename datatype>void shellsort(datatype data[],int n)
{
int i,j,flag,counter=1,gap=n;
datatype temp;
while(gap>1)
{
gap=gap/2;//每次逐渐减少gap,
do{
flag=0;
for(i=0;i<n-gap-counter;i++)//循环的次数是n-1-gap,可自行举例理解
{
j=i+gap;
if(data[i]>data[j])//用冒泡法对每次gap值对应的序列比较排序
{
exchange(&data[i],&data[j])
flag=1;}
}while(counter<n&&flag==1)
}
}
}