1.快速排序
快速排序是不稳定的排序算法,平均时间复杂度O(nlgn)。快速排序是利用了partition( )进行排序的。partition( )有两种实现形式,(1)利用两个指针一个头指针,一个尾指针,通过交换头尾指针所指的数进行排序; (2)一前一后两个指针同时从左往右进行遍历,如果前指针所遇到的数比主元小,则后指针右移一位,然后交换。Partition方法还可以用在很多地方,注意举一反三。
//quicksort 不稳定排序
void quicksort (int array[],int left,int right)
{
if (left < right)
{
int i = left, j = right;
int x = array[left];
while (i < j)
{
while (i < j && array[j] >= x)
j--;
if (i < j)
array[i++] = array[j];
while (i < j && array[i] <= x)
i++;
if (i < j)
array[j--] = array[i];
}
array[i] = x;
quicksort (array,left,j-1);
quicksort (array,j+1,right);
}
}
2.堆排序
堆排序是不稳定的排序算法,平均时间复杂度O(nlgn)。
//堆排序
void heap_build (int array[],int i,int len)
{
int left = 2*i;
int right = 2*i+1;
int max = i;
if (left < len && array[left] > array[max])
max = left ;
if (right < len && array[right] > array[max])
max = right;
if (max!=i)
{
swap(array[max],array[i]);
heap_build (array,max,len);
}
}
void heap_sort(int array[],int n)
{
int i;
for (i=n/2;i>=0;i--)
{
heap_build(array,i,n);
}
for (i=n-1;i>=1;i--)
{
swap(array[0],array[i]);
n=n-1;
heap_build(array,0,n);
}
}
稳定的排序算法:直接插入排序,冒泡排序,归并排序,基数排序。