首页 > 编程语言 >经典的快速排序算法

经典的快速排序算法

时间:2023-05-22 19:05:44浏览次数:37  
标签:arr leftp center int 算法 length swap 经典 排序


经典的快速排序算法 其中将一个数组按照枢纽元的大小将其分成左右两个部分的算法成为快速算法

这个写个避免了判断相等的情况 当遇到元素与枢纽元相等时停止 目的是为了产生两个相对平衡的左右数组

void testQuickSort(){
    int arr[] = {2, 4, 3, 9, 6, 5, 7, 0, 2, 1};
    //int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};

    quickSort(arr, sizeof(arr)/sizeof(int));

    for (int i = 0; i < sizeof(arr)/sizeof(int); i++) {
        printf("valus is %d\n", arr[i]);
    }
}

void swap(int *a, int *b){
    int temp = *a;
    *a = *b;
    *b = temp;
}

void quickSort(int arr[], int length){

    if (length <= 1) {
        return;
    }

    if (length == 2) {
        if (arr[0] > arr[1]) {
            swap(arr, arr + 1);
        }
        return;
    }

    int center = (length - 1) / 2;

    if (arr[0] > arr[center]) {
        swap(arr, arr + center);
    }

    if (arr[0] > arr[length - 1]) {
        swap(arr, arr + length - 1);
    }

    if (arr[center] > arr[length - 1]) {
        swap(arr + center, arr + length - 1);
    }

    swap(arr + center, arr + length - 1);

    int elementPivot = arr[length - 1];

    int leftp = 0;
    int rightp = length - 1;

    while (1) {
        while (arr[--rightp] > elementPivot) {

        }

        while (arr[++leftp] < elementPivot) {

        }

        if (rightp > leftp) {
            swap(arr + leftp, arr + rightp);
        }else{
            break;
        }
    }

    swap(arr + leftp, arr + length - 1);

    quickSort(arr, leftp);
    quickSort(arr + leftp, length - leftp);
}


标签:arr,leftp,center,int,算法,length,swap,经典,排序
From: https://blog.51cto.com/u_16124099/6326572

相关文章

  • 冒泡排序
    【三】冒泡排序基本思想:两个数比较大小,较大的数下沉,较小的数冒起来。过程:比较相邻的两个数据,如果第二个数小,就交换位置。从后向前两两比较,一直到比较最前两个数据。最终最小数被交换到起始的位置,这样第一个最小数的位置就排好了。继续重复上述过程,依次将第2.3...n-1个......
  • 邻接矩阵的算法设计
    题目描述假设图G采用邻接矩阵存储,分别设计实现以下要求的算法:1.输出每个顶点的入度2.输出每个顶点的出度3.求出度最大的一个顶点,输出其编号4.计算图中出度为0的顶点数5.判断图中是否有边<i,j> 解决思路1.入度是邻接矩阵中第i列的元素之和在函数InDegree()中,我们需要设置一个循环......
  • 裴波那契数列的递归和动态规划算法
    裴波那契数列的递归和动态规划算法一、   概论通过对裴波那契数列的例子,分析了递归和动态规划算法的本质。并且说明了两种算法的区别。裴波那契数列:800年前,意大利的数学家斐波纳契出版了惊世之作《算盘书》。在《算盘书》里,他提出了著名的“兔子问题”:假定一对兔子每个月可......
  • 页面置换算法的c语言实现
    #include<bits/stdc++.h>usingnamespacestd;intn;//物理块号数intlen,op;//进程数inta[100];//存储进程执行的先后顺序;intres[100][100];//存放进程执行的结果数组intoptfind[100],optflag[100];intlruflag[1000];intnru_value[100],nru_r[100],nru_m[100];voidprint......
  • 代码随想录算法训练营第十三天|239. 滑动窗口最大值、347. 前 K 个高频元素
    【参考链接】239.滑动窗口最大值【注意】 1.使用单调队列的经典题目。2.大顶堆每次只能弹出最大值,无法移除其他数值,造成大顶堆维护的不是滑动窗口里面的数值了。所以不能用大顶堆。3.需要一个队列,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉......
  • 【算法题】二维数组打印
    链接:https://www.nowcoder.com/questionTerminal/6fadc1dac83a443c9434f350a5803b51有一个二维数组(n*n),写程序实现从右上角到左下角沿主对角线方向打印。(注:主对角线方向为从左上角指向右下角这一斜线的方向)给定一个二位数组arr及题目中的参数n,请返回结果数组。 数......
  • 【算法题】骆驼命名法
    题目链接:https://www.nowcoder.com/questionTerminal/aed1c7bbc2604e7c9661a2348b0541b8?answerType=1&f=discussion从C/C++转到Java的程序员,一开始最不习惯的就是变量命名方式的改变。C语言风格使用下划线分隔多个单词,例如“hello_world”;而Java则采用一种叫骆驼命名法的规则:除......
  • 《数据结构与算法》之数据的顺存储
    导言:数据结构中,对一些数据序列我们使用的是顺序的方式存储,比较常见的有数组,链表,这些都是最基本的顺序存储的结构,我们会用几个简单的例子来描述顺序存储的方式和演变我们知道顺序存储中有链表,有链表我们就必须知道指针,所以我们先复习一下指针,再来看顺序存储一.指针在C语言中,我......
  • 算法学习记录(模拟枚举贪心题单):[NOIP2007]字符串的展开(未AC,明天找bug)
    题目链接https://ac.nowcoder.com/acm/contest/20960/1001解题思路很简单的模拟题,以后写模拟要先分两大类,元素在某个集合中存不存在的问题,再细分。未AC代码#include<iostream>#include<string>usingnamespacestd;//碰到'-'的展开条件:// 1.减号两侧同为小写字母......
  • 取名算法之用JAVA实现姓名测试
    一文中我谈到了名字的重要性。 作为易学高手的我(大师♂罗莊)对告诉各位码农如何制作取名系统 负有不可推卸的责任。 本次课程没有什么难度,就是根据名字笔画来计算天地人三才格 笔画的五行算法已经在上一讲说过,就是去十位数,个位来判断五行 取名算法之用JAVA实现汉字五......