快速排序(快排)

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

算法处理过程(截图参考 坐在马桶上看算法:快速排序):

代码:

public class QuickSort {

    public static void sort(int[] arr, int low, int high){
        int l = low;
        int h = high;
        int tmp = 0;
        if (l <= h){//扫描低位标小于高位标
            tmp = arr[l];
            while (l != h){//从两边交替扫描,直到l=h
                while (h>l && arr[h]>tmp) h--;
                //从右往左扫描,找到第一个比基准数据小的数,进行替换
                arr[l] = arr[h];
                while (l<h && arr[l]<tmp) l++;
                //从左往右扫描,找到第一个比基准数据大的数,进行替换
                arr[h] = arr[l];
            }
            arr[h] = tmp;
            sort( arr, low, l-1 );  //对基准元素左边的数据进行排序
            sort( arr, h+1, high ); //对基准元素右边的数据进行排序
        }
    }

    public static void main(String[] args){
        int[] arr = {10, 2, 1, 7, 12, 23, 32, 4, 6, 98};
        sort( arr, 0, arr.length-1 );
        for (int i : arr){
            System.out.println(i);
        }
    }

}

时间复杂度:基准数据选择为最大或者最小值时,时间复杂度为O(n^2),若选择的基准数据为中间数时,时间复杂度为O(nlog2n)

空间复杂度:O(log2n)

稳定性:非稳定排序

快排应用

把一个0-1串(只包含0和1的串)进行排序,你可以交换任意两个位置,问最少交换的次数?

采用快排,左边的0和右边的1都可以不用管,只计算需要交换的数据次数即可。

伪代码:

000...10100..1111

int count = 0;

for(int i=0,j=len-1; i<j; ++i,--j){

  for(; (i<j)&&(a[i]==0); ++i);

  for(; (i<j)&&(a[j]==1); --j);

  if(i<j) ++count;

}

原文地址:https://www.cnblogs.com/yhzhou/p/9230655.html

时间: 2024-10-05 04:01:46

快速排序(快排)的相关文章

算法导论学习之快排+各种排序算法时间复杂度总结

快排是一种最常用的排序算法,因为其平均的时间复杂度是nlgn,并且其中的常数因子比较小. 一.快速排序 快排和合并排序一样都是基于分治的排序算法;快排的分治如下: 分解:对区间A[p,r]进行分解,返回q,使得A[p–q-1]都不大于A[q] A[q+1,r]都大于A[q]; 求解:对上面得到的区间继续递归进行快排 合并:因为快排是原地排序,所以不需要特别的合并 从上可以看出最重要的就是分解函数,其按关键值将数组划分成3部分,其具体实现的过程见代码注释. 我们一般取数组的最后一个元素作为划分比较

快速排序—三路快排 vs 双基准

快速排序被公认为是本世纪最重要的算法之一,这已经不是什么新闻了.对很多语言来说是实际系统排序,包括在Java中的Arrays.sort. 那么快速排序有什么新进展呢? 好吧,就像我刚才提到的那样(Java 7发布两年后)快速排序实现的Arrays.sort被双基准(dual-pivot)排序的一种变体取代了.这篇文章不仅展示了为什么这个变化如此优秀,而且让我们看到Jon Bentley和Joshua Bloch的谦逊. 我当时做了什么? 与所有人一样,我想实现这个算法并且对一千万个数值排序(随机

快排---快速排序

//快速排序 void quick_sort(int s[], int l, int r) { if (l < r) { //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1 int i = l, j = r, x = s[l]; while (i < j) { while(i < j && s[j] >= x) // 从右向左找第一个小于x的数 j--; if(i < j) s[i++] = s[j]; wh

快速排序--QuickSort,看完五分彩开奖网平台搭建自己就能写出来的快排思路推演

快速五分彩开奖网平台搭建论坛:haozbbs.com Q1446595067排序(QuickSort)介绍首先发明者竟然敢给自己发明的算法叫做QuickSort,这个名字闪不闪亮?好比别的武功叫做六脉神剑.降龙十八掌,我这个叫做"天下无敌神功".别的排序算法都是按照特点来起的,你这个不是应该叫分块递归排序法吗?或者和希尔一样,叫做霍尔排序也可以啊,这么高调是要干啥啊?我给了他一次机会,特意去查了一下,这个名字并不是江湖朋友抬爱给的,就是发明者自己起的,社会社会...不过看完这篇博客,理

快速排序(经典快排以及随机快排)

快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 首先来了解一下经典快排: 其中就小于等于的区域可以优化一下,小于的放小于区域,等于的放等于区域,大于的放大于区域.可以利用荷兰国旗问题 荷兰国旗问题: 给定一个数组arr

快排 快速排序 qsort quicksort C语言

现在网上搜到的快排和我以前打的不太一样,感觉有点复杂,我用的快排是FreePascal里/demo/text/qsort.pp的风格,感觉特别简洁. 1 #include<stdio.h> 2 #define MAXN 10000 3 int a[MAXN]; 4 int n; 5 void Mysort(int l, int r) { 6 int x,y,mid,t; 7 mid = a[(l+r)/2]; 8 x=l; 9 y=r; 10 do { 11 while(a[x]<mid

快速排序——一次快排的应用(笔试&amp;面试)

将数组中的大写字母与小写字母分开 一:一个数组总存储有且in有大写和小写字母,编写一个函数对数组内的字母重新排列,让小写字母在所有大写字母之前.(相对顺序没有要求)[2012·中兴.2013·腾讯] 使用快排的一次排列即可实现,代码如下: 1 #include <iostream> 2 #include <string> 3 #include <vector> 4 using namespace std; 5 6 bool isUpper( char ch ) //eq

Python实现排序(冒泡、快排、归并)

Thomas H.Cormen 的<算法导论>上介绍的几个经典排序算法的Python实现. 1.冒泡排序: 简单的两重循环遍历,使最小(最大)的值不断地往上升(下沉)而实现的排序,算法时间为O(n2). 代码如下: 1 def up_sort(a): 2 # 冒泡排序 3 4 a_length = len(a) 5 while True: 6 i = 0 7 j = 1 8 9 while True: 10 if a[i] > a[j]: 11 a[i], a[j] = a[j], a[

堆排 归并排序 快排

堆排序的思想 利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,使得每次从无序中选择最大记录(最小记录)变得简单. 其基本思想为(大顶堆): 1)将初始待排序关键字序列(R1,R2....Rn)构建成大顶堆,此堆为初始的无序区: 2)将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,......Rn-1)和新的有序区(Rn),且满足R[1,2...n-1]<=R[n]; 3)由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,