数据结构——快速排序算法

今天来说一说快速排序:

基本思想:

  1. 任取一个元素 (如第一个) 为轴点
  2. 所有比它小的元素一律前放,比它大的元素一律后放,形成左右两个子表
  3. 对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个

注意:

  • 每一趟的子表的形成是采用从两头向中间交替式逼近法
  • 由于每趟中对各子表的操作都相似,可采用递归算法

代码实现:

#include <iostream>
using namespace std;

//找到第一个轴点,以这个轴点为界,将待排序的数组划分为
//[low,pivot),[pivot],(pivot,high]三部分
int Partition(int a[], int low, int high)
{
    if( low > high )//判断非法条件
        return -1;
    int pivot = a[low];//将轴点默认为数组的第一个元素a[low](备份)
    while (low < high)//从数组的两端 交替地 向中间扫描
    {
        while (low < high && pivot <= a[high])//在不小于pivot的前提下
        {
            high--;//向左拓展右端子序列
        }
        a[low] = a[high];//小于pivot的值归入左侧子序列
        while (low < high && pivot >= a[low])//在不大于pivot的前提下
        {
            low++;//向右拓展左端子序列
        }
        a[high] = a[low];//大于pivot的的值归入右侧子序列
    }
    a[low] = pivot;//将备份的轴点记录置于左、右子序列之间
    return low;//返回轴点的下标
}

//快排算法(递归)
void QuickSort(int a[], int low, int high)
{
    if (high - low < 2)//只有一个值是默认有序的,不必再进行排序
    {
        return;
    }
    int key = Partition(a,low,high);//找到轴点的下标
    QuickSort(a,low,key-1);//递归进行排序。一旦找到轴点就可以确定这个轴点
    QuickSort(a,key+1,high);//的位置就是排序后的的位置,所以不必再进行排序。
}

/*------测试代码------*/
int main()
{
    //int a[] = {1,2,4,3,12,45,2,54,6,32,44};
    int a[] = {21,21,54,6,3,44,5,5,65,33};
    int La = sizeof(a)/sizeof(a[0]) - 1;//这里必须减一,因为数组下标是从0开始的,否则会造成数组越界
    QuickSort(a,0,La);
    for (int i =0; i <= La; i++)
    {
        cout<<a[i]<<endl;
    }
    return 0;
}

输出结果:

《数据结构——快速排序算法》

时间效率: O(nlog2n) —每趟确定的元素呈指数增加

空间效率: O(log2n)—递归要用到栈空间

稳 定 性: 不稳定 —可选任一元素为支点。

    原文作者:排序算法
    原文地址: https://blog.csdn.net/u013271921/article/details/45973865
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞