算法之快速排序

原创 2016年07月04日 14:40:00
  • 基本概念

快速排序是一种分治的排序算法。它将一个数组分成两个子数组,将两部分独立的排序。当两个数组都有序时整个数组也就自然有序了。在快速排序中,切分的位置取决于数组的内容。切分的关键在于使数组满足下面三个条件:
1. 对于某个下表j,数组[j]的位置已经选定;
2. 数组[0]到数组[j-1]中的所有元素都不大于数组[j];
3. 数组[j+1]到数组[length-1]的所有元素都不小于数组[j]

我们一般通过递归地调用切分来排序。具体的切分方法是随意地选取数组[x]作为切分元素,即那个将会被排定的元素,然后我们从数组的左端开始向右扫描直到找到一个大于等于它的元素,再从数组的右端开始向左端扫描直到找到一个小于等于它的元素。这两个元素显然没有排定,因此我们交换它们的位置。如此继续,就可以保证左指针i的左侧元素都不大于切分元素,右指针j的右侧元素都不小于切分元素。当两个指针相遇时,我们只需要将切分元素数组[x]和左子数组最右侧的元素交换然后返回下标就可以了。

  • 代码实现
public class Quick {

    public static void Sort(int[] arr) {//使用sort方法传递一个数组,并调用method()方法
        method(arr,0,arr.length-1);
    }

    private static void method(int[] arr, int first, int last) {//method()方法,定义两个索引
        if(last <= first) {//当前后两个索引相交时,停止排序
            return;
        }
        int number = getNumber(arr,first,last);//获取切分点
        method(arr,first,number - 1);//以切分点为界,左边的数组进行排序
        method(arr,number + 1, last);//以切分点为界,右边的数组进行排序
    }

    private static int getNumber(int[] arr, int first, int last) {//获取切分点
        int i = first; 
        int j = last + 1;//获取数组两边的指针(即从两边开始移动)
        int choice = arr[first];//把第一个元素的值定义为切分点

        while(true) {

            while(arr[++i] <= choice) {//当左边的数小于切分点,继续运行
                if(i == last) {//当左边的数大于切分点时,跳出循环
                    break;
                }
            }
            while(choice <=  arr[--j]) {//当右边的数大于切分点,继续运行
                if(j == first) {//当右边的数小于切分点时,跳出循环
                    break;
            }
            }
            if(i >= j) {//两者相交时退出方法
                break;
            }
            int temp = arr[j];//调换位置
            arr[j] = arr[i];
            arr[i] = temp;


        }

        int temp2 = choice;//把切分点移动中间
        arr[first] = arr[j];
        arr[j] = t   emp2;



        return j;
    }

}
版权声明:本文为博主原创文章,未经博主允许不得转载。

分治法之快速排序算法理解介绍

分治法之快速排序算法理解介绍
  • qq_26071477
  • qq_26071477
  • 2016年06月11日 21:35
  • 1595

排序算法之快速排序详解(附示例代码)

1.快速排序简介 对于包含n个数的输入数组来说,快速排序是一种最坏情况时间复杂度为O(n的平方)的排序算法.虽然最坏情况时间复杂度很差,但是快速排序通常是实际排序应用中最好的选择.因为他的平...
  • liuxu841911548
  • liuxu841911548
  • 2017年02月10日 15:37
  • 1031

Java实现算法之快速排序

本文参考了:http://blog.csdn.net/morewindows/article/details/6684558 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因...
  • Rebirth_Love
  • Rebirth_Love
  • 2016年05月08日 14:21
  • 1087

八大排序算法 之 快速排序(填坑法)

排序思想: 1,将第一个数字作为基准数字,将数组分为左右两部分,左边是比它小的数字,右边是比它大的数字; 2,将左部分按照上面的思想再次进行划分成两部分,依次类推; 3,将右部分按照上面的思想再...
  • yxb_yingu
  • yxb_yingu
  • 2016年05月07日 11:36
  • 1036

啊哈算法-----快速排序

上一节的冒泡排序可以说是我们学习第一个真正的排序算法,并且解决了桶排序浪费空间的问题,但在算法的执行效率上却牺牲了很多,它的时间复杂度达到了O(N2)。假如我们的计算机每秒钟可以运行10亿次,那么对1...
  • binyao02123202
  • binyao02123202
  • 2014年02月27日 14:59
  • 4240

《算法(第四版)》排序-----快速排序

参考文章:   http://ahalei.blog.51cto.com/4767671/1365285 1.概念 快速排序,听这个名字就能想到它排序速度快,它是一种原地排序(只需要一个很小的辅助...
  • kwang0131
  • kwang0131
  • 2016年04月07日 14:33
  • 2732

经典算法与数据结构的c++实现——快速排序

因为是经典的算法,所以网上描述一大把,直接上个图,直观些,给记性不好的菜鸟(如我)一点儿提示。 快速排序是冒泡排序的一种改进。通过轴值的选择方法不同,算法的速度也不一样。本文下面的代码采取选择最左...
  • y277an
  • y277an
  • 2016年03月22日 17:24
  • 636

数据结构实验之排序八:快速排序 递归

Time Limit: 1000MS Memory Limit: 65536KB Problem Description 给定N(N≤10^5)个整数,要求用快速排序对数据进行升序排列,注意不得...
  • khn64
  • khn64
  • 2017年02月08日 19:22
  • 193

快速排序中的分割算法实现

这里介绍快速排序使用到的两种分割算法。 对于快速排序而言,先选定一个枢轴元素,以枢轴元素为基准比枢轴元素小的元素放在枢轴元素的左边,比枢轴元素大的元素放在枢轴元素的右边。这就是一次分割过程。 1,先介...
  • hapjin
  • hapjin
  • 2015年11月11日 19:38
  • 1364

数据结构 - 快速排序(Quick Sort) 详解 及 代码(C++)

快速排序(Quick Sort) 详解 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 快速排序(Quick Sort): 通过一趟排序...
  • u012515223
  • u012515223
  • 2014年04月25日 17:18
  • 4196
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法之快速排序
举报原因:
原因补充:

(最多只允许输入30个字)