快速排序算法实现

本文详细介绍了快速排序算法的实现过程,包括选取中心值、数组划分、递归调用等步骤,并通过一个具体示例展示了排序的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序算法实现

 

快速排序法的时间复杂度是O(nlog2n)

快速排序使用分割法对表进行排序。算法给出一个中心值,用它将表分为两部分。快速排序在数组内将元素分为若干部分。下面是一个具体的例子。

(注意:写代码的时候要确定高、低索引,中间索引)

假设数组A中含有10个整数值:

A=800,150,300,600,550,650,400,350,450,700

索引从0到9,所以中间索引为4,对应值为550,

第一步将550与A[0]交换位置,变成550,150,300,600,800,650,400,350,450,700;

第二步从A[1]开始往中间进行搜索,如果搜索到大于550的数值就停止,此时开始从A[9]往中间开始搜索,如果发现小于550的数值就停止,然后交换这两个值,即由550,150,300,600,800,650,400,350,450,700变成550,150,300,450,800,650,400,350,600,700;以此类推550,150,300,450,350,650,400,800,600,700;550,150,300,450,350,400,650,800,600,700;然后将A[0]与400交换位置400,150,300,450,350,550,650,800,600,700;至此,以550为分界点,左边子表都是小于550的,右边都是大于550,然后利用递归思想将这两个边再利用快速排序实现。

template <class T>
    void QuickSort(T A[],int low,int high)
   {

 //存放中心索引及其值的局部变量,以及用于扫描的索引
     T pivot;   

 int scanUp,scanDown;
     int mid;

//若元素个数小于1个,则返回
     if(high-low<=0)
       return;
     else

//若子表有两个元素,对其进行比较,并在必要时进行交换
     if(high-low==1)
     {
        if(A[high]-A[low])
        swap(A[low],A[high]);
        return;
     }

//取中心索引并将其值赋给pivot
     mid=(low+high)/2;
     pivot=A[mid];

//交换pivot及低端元素的值并初始化扫描索引
     swap(A[mid],A[low]);
     scanUp=low+1;
     scanDown=high;

//定位错位元素,并设定结束条件
     do
     {
        while(scanUp<=scanDown&&A[scanUp]<=pivot)
        scanUp++;
        while(pivot<A[scanDown])
        scanDown--;
        if(scanUp<scanDown)
        swap(A[scanUp],A[scanDown]);
     } while(scanUp<scanDown);

//将pivot拷贝到scanDown位置,分开连个子表
    A[low]=A[scanDown];
    A[scanDown]=pivot;

//若低端子表有两个或更多元素,则进行递归调用
    if(low<scanDown-1)
       QuickSort(A,low,scanDown-1);

//若高端子表有两个或更多元素,则进行递归调用
    if(scanDown+1<high)
       QuickSort(A,scanDown+1,high);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值