`
SCYForce
  • 浏览: 40811 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

算法笔记(第一部分)-- 排序之白话快速排序

阅读更多
记得今年暑假找实习的时候,去过一家小公司Xoopit做On-Site interview,里面有个工程师给我出了一道Hardcode的问题:给定一个无序数组,以及一个数组中的元素,要求输出的数组中小于这个数的数都有序的排在它之前,大于它的数都有序的排在它之后。当时想了半天才写出一个很烂的解法。最近重新复习排序,发现这不就是典型的Quick Sort的应用么。

快速排序的步骤:
1. 从数组中选出一个中枢数(pivot)
2. 重新排列该数组,让数组中比该数小的数都排在该数的前面,比该数大的数都排在该数的后面。经过这次排列,该数处于其最终位置,并将原数组分为了两个子数组(大于它的数组和小于它的数组),这就是分段的过程。
3. 递归的排列各个子数组,直至最后整个数组排序完成。

快速排序的平均时间复杂度为O(nlogn),空间复杂度依据各种实现方式有所不同。

快速排序的动画:


快速排序代码-partition:
public int partition(int[] data, int left, int right, int pivotIndex){
           int pivotValue = data[pivotIndex];
           swap(data, pivotIndex, right);// Move pivot to end
           int storeIndex = left;
           for(int i=left; i<right; i++){
             if(data[i]<=pivotValue){
                   swap(data, i, storeIndex);
                   storeIndex = storeIndex + 1;
             }
           }
           swap(data, storeIndex, right);// Move pivot to its final place 
           return storeIndex;
      }


quickSort:
public void quick_sort(int[] data, int left, int right){
            if(right>left){
                  int pivotIndex = left;
                  int pivotNewIndex = partition(data, left,right, pivotIndex);
                  quicksort(data, left, pivotNewIndex - 1);
                  quicksort(data, pivotNewIndex + 1, right);
            }
      }


partition的过程(递增):
1. 将中枢数移至数据集的最右边
2. 建立一个中枢数最终位置的下标值。从数据集的最左边循环至最右边,依次与该中枢数相比较,若该数小于中枢数,则将该数与中枢数最终位置值交换,最终位置的下标加一
3. 最终将中枢数移至最终位置,返回最终位置下标

这种实现方法的空间复杂度是O(nlogn),它是in-place的算法,并且因为在一个partition的过程中可能会交换两数的位置,因此它是不稳定的。感觉初次理解快排有些难度,自己写出来就好多了。
10
3
分享到:
评论
9 楼 sunspring 2008-09-02  
swap函数呢??
8 楼 王者之剑 2008-09-01  
图片怎么做的
7 楼 backbase 2008-09-01  
谢谢楼主的分享, 希望楼主以后分享跟多的算法文章,
6 楼 25wanghai 2008-08-31  
我也喜欢这图片,谢谢哈
5 楼 isyull 2008-08-31  
引用
要求输出的数组中小于这个数的数都有序的排在它之前,大于它的数都有序的排在它之后

直接给数组排个序,任何一个数都满足上面这句话
4 楼 chamborghini 2008-08-31  
图片挺不错的!
3 楼 bnmcvzx 2008-08-29  
为什么不说它是2叉树的算法呢
2 楼 zpl3001 2008-08-29  
1 楼 congjl2002 2008-08-29  
这个图片到是非常的生动,谢谢分享

相关推荐

    MoreWindows白话经典算法之七大排序

    冒泡排序、插入排序、选择排序、希尔排序、归并排序、快速排序和堆排序是七大基础的计算机算法,它们各自有着不同的特点和适用场景。 一、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地遍历要...

    白话经典算法系列之六 快速排序 快速搞定 - MoreWindows - 博客园1

    快速排序是一种高效的排序算法,由C.R.A.Hoare在1962年提出。它基于分治策略,但其完整流程可以更准确地描述为“挖坑填数+分治法”。快速排序的核心思想是通过选取一个基准数,将数组分为两部分:一部分的所有元素都...

    MoreWindows白话经典算法之七大排序第2版(高清)

    本书《更多Windows白话经典算法之七大排序第2版》是一部深入浅出讲解七种经典排序算法的著作,旨在帮助读者理解并掌握冒泡排序、直接插入排序、直接选择排序、希尔排序、归并排序、快速排序以及堆排序等基本概念和...

    MoreWindows白话经典算法之七大排序(高清版)

    ### 白话经典算法之七大排序 #### 一、冒泡排序 冒泡排序是一种简单直观的排序算法,它的基本思想是从第一个元素开始,比较相邻元素的大小,如果前一个元素大于后一个元素则交换它们的位置,这样一轮比较下来,...

    白话经典算法之七大排序

    快速排序的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 堆排序是一种树形选择排序,是在排序...

    白话经典算法之七大排序(高清版)

    《白话经典算法之七大排序》是一本专为初学者设计的算法教程,旨在通过简单易懂的语言,帮助读者深入浅出地理解并掌握七大排序算法。这些排序算法是计算机科学与信息技术领域的基础,对于提升编程能力和解决实际问题...

    经典算法之七大排序白话讲解第二版

    其基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行。 #### 实现思路 1. *...

    [网盘]MoreWindows白话经典算法之七大排序第2版(高清)

    在第一版的基础上新加了对冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序和堆排序这七种常用的排序方法的总结篇,方便大家复习,合适作为笔试面试前的复习资料。

    排序算法经典讲解

    本资源"MoreWindows白话经典算法之七大排序(高清版).pdf"提供了一套详尽的排序算法讲解,涵盖了七大经典的排序算法。以下是这些排序算法的详细介绍: 1. 冒泡排序(Bubble Sort): 冒泡排序是一种简单的交换排序,...

    白话算法(理论联系实际)-初探遗传算法接近完美

    1. **种群**:遗传算法的起点是一个包含多个解(个体)的集合,每个个体都有一个与之相关的适应度值,这通常反映了该解的质量或性能。 2. **基因编码**:个体的基因编码是问题解决方案的表示方式,可以是二进制串、...

    白话经典算法

    Hoare提出,采用分治策略,通过选取一个“基准”元素,将数组分为两部分,小于基准的放左边,大于的放右边,然后递归地对左右两边进行快速排序。平均时间复杂度为O(n log n),最坏情况下为O(n^2),但实际应用中性能...

    More Windows白话经典数据结构算法之七大排序最新整理版

    ### 数据结构与排序算法详解 ...当数据量较大时,这两种算法的性能会下降,此时应考虑使用更高效的排序算法,如快速排序、归并排序等。在实际应用中,了解各种排序算法的特点,选择最适合当前场景的算法至关重要。

    白话的排序总结

    快速排序是一种高效的排序算法,同样采用分而治之的策略,通过选择一个基准元素来分割数组。 **基本步骤**: 1. 选择一个基准元素。 2. 将小于基准的所有元素放在基准左边,大于基准的所有元素放在右边。 3. 对左右...

    最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(CC++)

    最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(CC++),希望对你能有所帮助!

    c++,排序,快速排序

    总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速排序,快速搞定。 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用...

    基于python 3 编程实现常用的排序算法,包括:冒泡排序、直接插入排序、直接选择排序、希尔排序、归并排序、快速排序、堆排序

    基于python 3 编程实现常用的排序算法,包括:冒泡排序、直接插入排序、直接选择排序、希尔排序、归并排序、快速排序、堆排序.zip 基于python 3 编程实现常用的排序算法,包括:冒泡排序、直接插入排序、直接选择...

Global site tag (gtag.js) - Google Analytics