首页 > 其他分享 >快速排序

快速排序

时间:2022-10-11 17:48:15浏览次数:49  
标签:移动 指向 ++ 基准 int array 排序 快速

首先我们要对一组数据进行排序:

  在数组中选一个基准数(通常为数组第一个,黄圈圈标记了);

  将数组中小于基准数的数据移到基准数左边,大于基准数的移到右边,怎么移动,后面说;

  对于基准数左、右两边的数组,不断重复以上两个过程,直到每个子集只有一个元素,即为全部有序。

好了,咱们开始吧!
  快速排序需要两个哨兵,i 和 j,分别指向数组的头和尾。接下来就要进行移动。

 

 

我们通常选择第一个元素作为基准数,去移动数组元素,使其达到这个基准数的左边都是小于它的,右边都是大于它的。开始移动 i 和 j , i 和 j 是交互移动的,这里我们需要先移动 j,这是为甚呢,原因是先移动 j,等到这一行移动结束,i 的下一个就是 j 的时候,我们先移动 j ,可以避免将数据移动错误,后面会有体会。
当移动 j 时,就开始比较 j 是否比基准数大,如果大于或者等于就 j–,否则再看 i,如果 i 小于等于6,则i++ 再与基准数进行比较,否则 i 就要与 j指向的值互换,我们拿上面那个看

第一步:看j的值比6小,然后看i,i的值是6,所以i++,后面 i继续++,4,3,5都比6小,所以 i 就移动到了7下面。

 

 到这里,j 所指向的值要与 i 所指向的值互换。

 

 互换完成,后面在比较 j 所指向的位置是否比基准数大,如果大就 j–;
这里 7 , 9 ,都比6大,所以j–,进行两次,j 就到达了4的下面。

 

 4比6小,所以要再看 i,i 指向0,所以 i需要 i++,到 1,1也小于6, 所以 i 还需要++,到这里 i 就和 j指向同一个数4,

 

 然后 i = j 了,不能够满足条件,所以就要进行互换,将 i 指向的数,与基准数互换,这一轮比较就结束了,

 

 到这里,基准数6的左边都比6小,右边都比6大。后面还是按照这个来分别再基准数6的左右开始比较

后面就找这样来,在左右两边再各自将第一个元素作为基准数进行排序。

 

///快速排序
void gxy_quick_sort(int *array, int low, int high)
{
    int i,j,temp;
    int tmp;

    i = low;
    j = high;
    tmp = array[low];   //任命为中间分界线,左边比他小,右边比他大,通常第一个元素是基准数

    if(i > j)  //如果下标i大于下标j,函数结束运行
    {
        return;
    }

    while(i != j)
    {
        while(array[j] >= tmp && j > i){
            j--;
        }

        while(array[i] <= tmp && j > i){
            i++;
        }

        if(j > i){
            temp = array[j];
            array[j] = array[i];
            array[i] = temp;
        }
    }

    array[low] = array[i];
    array[i] = tmp;

    gxy_quick_sort(array,low,i-1);
    gxy_quick_sort(array,i+1,high);
}

 

标签:移动,指向,++,基准,int,array,排序,快速
From: https://www.cnblogs.com/ink-white/p/16780008.html

相关文章

  • mysql 以某一列排序加序号
    加序号函数row_number()、rank()和dense_rank()加序号函数over()中必须有orderby排序row_number()row_number()OVER([partitionby...]orderby...)为一个分区中的......
  • 如何将手机便签里的照片和视频,快速保存到电脑?
    对于不少职场人士来说,日常使用频率较高的电子设备就是手机和电脑了,并且在办公时,有时候还需要把手机中的照片和视频批量保存到电脑中使用。那么如何将手机里的照片和视频,快......
  • java Spring Cloud 全环境 简明快速 精准 详解 视频课程 -专题视频课程
    Maven下SpringCloud全环境—10645人已学习课程介绍        本课程介绍SpringCloud+maven+Eureka+zuul+微服务+客户端+feign+hystrix+ribbon+config负载均衡......
  • 前段 HTML5/CSS+jquery +javascript 13天 短期快速 从基础 入门到实战精通 项目实战-
    HTML5/CSS+jquery+javascript13天从基础入门到实战精通项目实战—14780人已学习课程介绍        1.前端技术总体介绍htmlcssjqueryjavascript2.编辑第......
  • DQL_排序查询_DQL聚合函数
    1.排序查询 *语法:orderby子句 *orderby排序字段1排序方式1,排序字段2排序方式2... *排序方式: *ASC:升序,默认的 *DESC:降......
  • 堆排序
    一准备知识堆的结构可以分为大根堆和小根堆,是一个完全二叉树,而堆排序是根据堆的这种数据结构设计的一种排序,下面先来看看什么是大根堆和小根堆1.1大根堆和小根堆......
  • 排序查询
    排序查询语法 order by子句orderby 排序字段1 排序方式1,排序字段2 排序字段2排序方式ASC 升序 默认的DESC 降序......
  • drf分页、排序、过滤
    drf分页、排序、过滤自定义频率类#首先我们导入时间模块用来计时importtime#创建一个类继承BaseThrottleclassFrequency(BaseThrottle):#创建一个字典用来......
  • 自定义频率类与分页、排序、过滤功能
    自定义频率类fromrest_framework.throttlingimportBaseThrottleimporttimeclassMyThrottling(BaseThrottle):#存放用户访问记录:{IP1:[时间2,时间1]}......
  • Git项目管理快速入门
    Git是什么Git的理解:Git是目前世界上最先进的分布式版本控制系统(没有之一),用于敏捷高效地处理任何或小或大的项目。简单理解就是代码管理工具。使用Git一般处于以下3......