快速排序算法
冒泡排序(Bubble Sort)非常熟悉吧,这种排序算法的思路很简单,但是由于时间复杂度比较高(O(n*n)),所以渐渐被更高效的算法所取代。这些高效算法中就包括了著名的快速排序算法(Quick Sort)。
快速排序算法的基本思想是,通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
一趟快速排序的算法是:附设两个指针low和high,它们的初值分别为low和high,设枢轴记录的关键字为pivotkey,则首先从 high所指位置起向前搜索找到第一个关键字小于pivotkey的记录和枢轴记录相互交换,然后从low所指位置起向后搜索,找到第一个关键字大于 pivotkey的记录和枢轴记录互相交换,重复这两步直至low=high为止。由此可以该“枢轴”记录最后所落的位置i作为分界线,将序列分隔成两个 子序列。
实际上low和high可以被理解为位置标志,它们所指向的只是位置。而pivotkey就是一个数值,它被选取被序列中的一个特定元素。在每趟的快排当中,都是low和high所指位置的元素和pivotkey来做比较。
快速排序的算法要分两大块:
第一大块:一趟快速排序的算法程序,我们将其定为一个函数partseq()
第二大块:整个快速排序算法程序,此程序要调用第一大块的partseq函数,而且在这个部分,我们使用了递归算法来实现多趟快排。
===================================================================================
快速排序算法源代码如下:
int partition(ElementType arr[], int low, int high)
{
ElementType p = arr[low];
ElementType temp;
while(low < high)
{
while(low < high && arr[high] >= p) high--;
arr[low]=arr[high];
while(low < high && arr[low] <= p) low++;
arr[high]=arr[low];
}
arr[low]=p;
return low;
}
void quicksort(ElementType arr[],int low, int high)
{
int loc;
if(low < high)
{
loc = partition(arr, low, high);
quicksort(arr, low, loc-1);
quicksort(arr, loc+1, high);
}
}