算法之快速排序

原创 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;
    }

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

相关文章推荐

快速排序算法

  • 2015年05月01日 16:41
  • 1KB
  • 下载

快速排序C++算法

  • 2013年06月15日 10:19
  • 2KB
  • 下载

算法导论 - QuickSort 快速排序 C++实现

算法导论的快速排序还和一般书上的快速排序是有点不一样的。 当然书习题也给出了一般快速排序的方法,其分区函数学名叫Hoare partition。 书本介绍的排序可以用图看的很清晰: 然后配合C++...
  • kenden23
  • kenden23
  • 2013年11月09日 10:32
  • 13002

两张不同的快速排序算法

  • 2013年06月09日 18:47
  • 3KB
  • 下载

快速排序算法

  • 2013年10月27日 09:58
  • 5KB
  • 下载

白话经典算法系列之六 快速排序(Quick sort)

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个...

快速排序算法

  • 2013年08月04日 23:18
  • 2KB
  • 下载

快速排序算法C 源文件

  • 2014年08月07日 16:05
  • 1KB
  • 下载

《算法导论》8、快速排序实现(C++)

首先上一个正常版的,这种版本的程序对于升序或者降序的数组,会达到最差情况。 #include #include using namespace std; int partition(int* A...

C#快速排序算法

  • 2014年02月22日 14:14
  • 21KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法之快速排序
举报原因:
原因补充:

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