首页 > 其他分享 >C语言快速排序详解

C语言快速排序详解

时间:2023-10-15 17:11:53浏览次数:44  
标签:arr right int 基准 C语言 详解 排序 left

【1】快速排序核心思想

  核心思想是分而治之,每一轮排序都会选出一个基准,一轮排序完成后,所有比基准小的数一定在左边,比基准大的数一定在右边,在分别通过同样的方法对左右两边的数组进行排序,不断划分,最后完成整个数组的排序。它的效率相比冒泡排序的双重for循环有所提升。时间复杂度(logn)

【2】快速排序图解

【3】快速排序代码详解

#include <stdio.h>
#define N 10

// 函数声明
void quickSort(int arr[], int left, int right);

int main() {
    // 标准的输入输出不需要缓存,直接输出
    setbuf(stdout, NULL);

    int arr[N] = {4, 3, 8, 2, 1, 7, 5, 6, 9, 0};

    quickSort(arr, 0, N - 1);

    printf("数组升序排列:");
    for (int i = 0; i < N; ++i) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

/**
 * 快速排序
 */ 
void quickSort(int arr[], int left, int right) {
    if (left >= right) {
        return;
    }
    int l = left, r = right;
    int base = arr[left];
    while (l < r) {
        // 依次从右边判断元素是否比基准大,如果比基准大:右边指针往前走
        while (l < r && arr[r] >= base) {
            r--;
        }
        // 出并列的while循环:从右边比较时已经遇到比基准小的值【替换左边的值】
        arr[l] = arr[r];
        // 依次从左边判断元素是否比基准小,如果比基准小:左边指针往后走
        while (l < r && arr[l] <= base) {
            l++;
        }
        // 出并列的while循环:从左边比较时已经遇到比基准大的值【替换右边的值】
        arr[r] = arr[l];
    }
    // 出并列的while循环:当前这一趟已经比较完毕,比基准大的在基准下标的右边,比基准小的在基准下标的左边
    arr[r] = base;
    // 递归排序左边
    quickSort(arr, left, r - 1);
    // 递归排序右边
    quickSort(arr, r + 1, right);
}

【4】快速排序执行结果

 

标签:arr,right,int,基准,C语言,详解,排序,left
From: https://www.cnblogs.com/blogtech/p/17765824.html

相关文章

  • JAVA中BigDecimal详解
    一、BigDecimal比较大小二、加减乘除运算BigDecimalone=newBigDecimal("0.123");BigDecimaltwo=newBigDecimal("1.23");1、加法:add//加法运算BigDecimalthree=one.add(two);2、减法:subtract//减法运算BigDecimalfour=two.subtract(one);3、乘法:multiply//乘法运算......
  • MySQL事务隔离级别详解及应用指南
    MySQL作为关系型数据库管理系统,对于多个并发事务之间的隔离和并发控制是必不可少的。在MySQL中,提供了四种事务隔离级别,分别是:读未提交、读已提交、可重复读和串行化。读未提交在该隔离级别下,一个事务可以读取另一个并发事务未提交的数据,可能会出现“脏读”问题,即读到了未经授权的数......
  • Oracle分区表技术详解
    Oracle是如何存储数据的?逻辑存储与物理存储在国企或者一线大厂,一般都会选择使用Oracle数据库,程序通过mybatis等持久层框架访问Oracle数据库,指定表空间,表空间内包含若干张表,表中存有行数据,行数据以行片段的形式存储在数据库块中,①当插入的行太大,无法装入单个块时;②或因为更新的......
  • sort是不稳定排序
    一道题调了一周,今天终于调过了……题目不算很难写,就是poj1007的DNAsorting,字符串求逆序数然后升序排序。之前交的代码是这样的:#include<iostream>#include<algorithm>usingnamespacestd;typedefstructnode{charstr[55];intnum;}Node;boolcmp(Nodea......
  • TCP/IP协议、三次握手、四次挥手详解
    TCP/IP协议模型(TCP协议)传输控制协议是一种面向连接的、可靠的、基于字节流的方式进行有序的无差错的数据传输通讯协议,它负责完成传输层所指定的功能,利用重发技术和拥塞控制机制,向应用程序提供可靠的通信连接,使它能够自动适应网上的各种变化。比如:数据报检测、流量控制、拥塞控......
  • 【C语言入门】第十四天
    【例题1】1260.二维网格迁移-力扣(LeetCode)/***Returnanarrayofarraysofsize*returnSize.*Thesizesofthearraysarereturnedas*returnColumnSizesarray.*Note:Bothreturnedarrayand*columnSizesarraymustbemalloced,assumecallercallsfree(......
  • 【C语言入门】第十五天
    【例题1】938.二叉搜索树的范围和-力扣(LeetCode)/***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*/intrangeSumBST(structTreeNode*root,intlow,inthigh){......
  • 1+X证书--传感器应用开发初级-C语言点亮LED灯
    #include<CC2530.h>//引入头文件CC2530.h。#defineled1P1_0//宏定义led1为端口P1_0。#defineled2P1_1//宏定义led2为端口P1_1。voidmain(void)//在main函数中进行程序的运行。{P1DIR=(0x01<<0)|(0x01<<1);//定义输出端口。led1=1;//点亮led1灯:1是亮,0是灭。led......
  • 一.排序算法---并归排序
    一.并归排序(自定义实现)merge函数:这个函数用于将两个已排序的子数组合并为一个更大的已排序数组。它包括创建临时数组L和R来存储左半部分和右半部分的元素,然后比较这些元素并将它们按升序合并到原始数组arr中。mergeSort函数:这个函数是归并排序的主要函数。它采用递......
  • Python 中 sys.argv 用法详解
    一、Pythonsys模块“sys”是“system”,是一个系统模块,该模块提供了一些接口,用户访问python解释器自身使用和维护的变量,同时模块中还提供了一些函数,而我们今天要讲解的argv就是其中一个函数。二、sys.argv上一篇文章我们讲到了引用模块,这里sys就相当于一个模块,而argv就是......