没事干 回忆下快排

递归都是把问题细化后找到解决问题的通用路径然后决定结束条件

快排思路 : 每进一层都会梳理元素顺序 比key值大的放右边 比key值小的放左边 每次这样执行下去 最终我们就得到了一个有序的数组

来看一下这一步骤应对的操作:

  while (true)
            {
                #region 单一次换值  在外层套个while处理多个这种情况的出现          key = (left + right)/2;
                //找到左边比key值大的
                while (arr[++left] > key) ;
                //找到右边比key小的
                while (arr[--right] < key) ;
                //左边索引比右边大那就说明这牌数据 左右两边值都合规矩
                if (left >= right)
                    break;
                arr[left] = arr[right] + arr[left] - (arr[right] = arr[left]);
                #endregion 处理结束
            }

这样确保了key的左侧比key小右侧比key大 然后现在的情况就是 得到两个宏观上有序的数组 分别是 0-key值所在索引的左侧(即 left-1) 和 key值所在索引的右侧(即right+1)

然后 我们分别对这两个数组继续这种操作

//分别对左右侧数据进行梳理
sortMethd(arr, left, i - 1);
sortMethd(arr, j + 1, right);

这样 只要进行到right<=left的时候即可说明此时数组是完全有序的

像不像二叉树遍历哈哈  这就是分治算法的小例子

下面贴下完整代码:

 void QuickSort(int[] arr, int left, int right)
    {
        if (left < right)
        {
            int key = arr[(left + right) / 2];
            int i = left - 1;
            int j = right + 1;
            while (true)
            {
                while (arr[++i] < key) ;
                while (arr[--j] > key) ;
                if (i >= j)
                    break;
                arr[i] = arr[j] + arr[i] - (arr[j] = arr[i]);
            }
            QuickSort(arr, left, i - 1);
            QuickSort(arr, j + 1, right);
        }
    }

原文地址:https://www.cnblogs.com/chenggg/p/11048672.html

时间: 2024-08-04 23:51:00

没事干 回忆下快排的相关文章

Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等

本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排序.快速排序(重点).堆排序.归并排序等等.看下图: 给定数组:int data[] = {9,2,7,19,100,97,63,208,55,78} 一.直接插入排序(内部排序.O(n2).稳定) 原理:从待排序的数中选出一个来,插入到前面的合适位置. [java] view plain copy

常见的几种排序算法-插入、选择、冒泡、快排、堆排等

排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排序.快速排序(重点).堆排序.归并排序等等.看下图: 给定数组:int data[] = {9,2,7,19,100,97,63,208,55,78} 一.直接插入排序(内部排序.O(n2).稳定) 原理:从待排序的数中选出一个来,插入到前面的合适位置. package com.xtfggef.algo.sort; public

hdu1157 快排

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1157 大意:排序,取中间数. PS:1.自己实现了下快排函数,也可以使用#include<algorithm>下的sort(a,a+n);函数,默认升序,若要降序or结构体排序可以增加第三个参数,声明排序规则. 2.在写这个快排的时候出现了很多问题,花了比较多的时间,对自己很不满意. 3.在这个while循环里写自减时,应该是j=high+1(分(low~p-1)和(p+1~high)),若不进行hi

初探快排

学了数据结构,实现下快排, public void QuickSort1(float[] seq,int low,int hight){int i = low;//记录最左值索引int j = hight;//记录最右值索引float temp = seq[low];//记录比较值(此处是最左值)while (low < hight)//每轮比较{while (low < hight && temp >= seq[hight]){hight--;}seq[low] = s

hdu--4022--multimap&lt;别人用快排+二分,没学好&gt;

本来 我是想直接开2个计数数组 存下 行 列各自的元素个数的.. 可是 数据达到了 10^9 但是数据个数 只有10^5 虽然可以考虑用 离散化...但我想先map试下 毕竟 离散化烦~ 关于multimap的使用 和map还是有点差别的..但是 我们单纯地只是使用 stl中的函数的话 还是不存在什么难度吧 听说 <<STL源码剖析>>不错...可是 不太适合初学者~ =_=   大师 经典.. 我这题的wa错误 太难找了 厌死.... 我因为一开始想使用数组的原因  多此一举地

快排,随机快排,双路快排,三路快排的理解

再讲快排之前,首先对于任何一个数组,无论之前是多么杂乱,排完之后是不是一定存在一个数作为分界点(也就是所谓的支点),在支点左边全是小于等于这个支点的,然后在这个支点右边的全是大于等于这个支点的,快排过程就是寻找这个支点过程 先看普通的快排(普通单路快排) 代码如下 let findIndex = (arr, l, len) => { let par = arr[l], j = l for (let i = l + 1; i <= len; i++) { if (arr[i] < par)

C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)

#include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student //结构体声明 { long num; int score; struct Student* next; }; int n; struct Student* creat() //创建单向链表 { struct Student *head=NULL, *p_before, *p_later; p_before =

大话快排 和 归排的渊源

一:起因 (1)包括冒泡算法.快排算法.插入排序算法等:还有基于外部排序的归并排序(以二路归并排序为例 ) 但是基本上在一个数量级上: (2) mergesort (归并排序) 可以应用在外部排序,这与基于内存的quicksort(快速排序)略有不同,他们的算法复杂度都可以达到O(nlogn) (3)mergesort 是稳定的排序算法,需要额外的空间开销O(n):quicksort 是非稳定的排序算法,额外的空间开销O(1):两者的核心思想都来源与分支的策略(divide and conque

淘宝等seo广告里面所讲的三天上首页的快排技术大揭秘

淘宝等seo广告里面所讲的三天上首页的快排技术大揭秘 淘宝seo快排技术 今天,我在志在指尖群里面看了看,有人说做一个排名其实非常的简单(我去,简单?想做好seo这是何等漫长的一个事情,谈何简单)我们都知道,做好seo,不仅要做好站内,也要做好站外,不管是关键词布局,内链布局等,还是外链创设,在这是文章书写等,这都是需要很大耐心以及技术的.所以,我没打扰他,我就想听听他口中所谓seo'简单'二字是什么意思,结果意想不到,他就直说了四个字-淘宝快排-what fuck?这四个字让我笑得肚子疼(这里