快速排序
(1)基本思想
在待排序的数组的n 个元素中取一个元素(一般取第一个),将其移动到这样的位置:在其之前的元素的值都小于它,在其之后的元素都大于它,这样是一趟快速排序;
然后对数组的两个部分进行同样的操作,直到每部分只有一个记录为止;
总之,每趟使表的第一个元素放在适当位置,将表两分,再对两子表进行同样的递归划分,直至划分的子表长度为1!
(2)代码:
//返回基准位置
int devide_array(int data[],int low,int high)
{
int last_small = low;
int pivot = data[low];
for(int i = low + 1; i <= high;i++)
{
if(data[i]<pivot)
{
last_small++;
swap(data[last_small],data[i]);
}
}
swap(data[low],data[last_small]);
return last_small;
}
void quick_sort(int *data,int left,int right)
{
if(left<right)
{
int temp = devide_array(data,left,right); //保证:前部分 < data[temp] < 后部分
quick_sort(data,left,temp-1); //递归思想
quick_sort(data,temp+1,right);
}
}
(3)小结(快速排序性能)
最好时间O(nlogn) 平均时间O(nlogn) 最坏时间O(n^2)
稳定性--不稳定
解释:在所有同数量级(O(nlogn))的排序方法中,快速排序被认为是平均性能最好的一种;
但是,若初始记录序列按关键字逆序或基本有逆序时,快速排序则蜕化为冒泡排序,此时,算法的时间复杂度为O(n^2)