关闭

算法学习之排序:快速排序算法

标签: 快速排序算法
223人阅读 评论(0) 收藏 举报
分类:

算法是程序的灵魂

1.简介

假设待排序数组为:A[0]…A[N-1]。取第一个数据A[0]作为关键数据,将所有比它小的数放在它前面,所有比它大的数放在它后面。这个过程称为一趟快速排序。递归调用“一趟”的操作,对数组进行分半处理。

2.算法描述

1)设置两个变量i、j,排序开始的时候 i = 0, j = N-1
2)以第一个元素作为关键数据, 赋值给key,即key=A[0]
3)从j开始向前搜索(j- -),找到第一个小于key的值A[j],记录此时的位置,j
4)从i开始向后搜索( i++ ),找到第一个大于key的值A[i],记录此时的位置,i
5)交换A[i]于A[j]的值
6)重复3),4),5)的操作,直到i=j,然后交换A[i]与key的值
7)递归调用,将数组分左右两部分重复以上所有步骤。

3.代码

//定义一个类QuickSort
public class QuickSort{
    Integer[] arr;
    QuickSort(Integer[] arr){
        this.arr = arr;
    }
    public void sort(int left,int right){
        int i = left;//记录低位
        int j = right;//记录高位
        int t = 0;//交换数据的中间变量
        int key = 0;//基准数
        if(left > right){
            return;
        }
        key = arr[left];//以最左侧数据为基准数
        while(i != j){
            //从右边开始找,找到比key小的数
            while(arr[j] >= key && i < j){
                j--;
            }
            //从左边开始找,找到比key大的数
            while(arr[i] <= key && i < j){
                i++;
            }
            //交换找到的比key小的数和比key大的数
            if(i < j){
                t = arr[j];
                arr[j]= arr[i];
                arr[i] = t;
            }
        }//while
        //将基准数放置于中间位置,它左边数全部小于它,右边全部大于
        arr[left] = arr[i];
        arr[i] = key;
        //递归调用
        sort(left,i-1);
        sort(i+1,right);
    }
}
//测试类TestClass
public class TestClass{
    public static void main(String[] args){
        Integer[] list = {1,9,3,8,4};
        QuickSort quickSort = new QuickSort(list);
        quickSort.sort(0,list.length-1);
        for(int i = 0;i<list.length;i++){ 
            System.out.print(list[i]+" ");
        }
    }
}

参考资料:
http://ahalei.blog.51cto.com/4767671/1365285

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

结合题目讲解“快速排序算法”

根据一道快速排序算法自考题,进行学习方法上的反思,同时讲解自己对快速排序算法的理解
  • sun15732621550
  • sun15732621550
  • 2016-10-16 16:44
  • 2302

白话经典算法系列之六 快速排序 快速搞定

http://blog.csdn.net/morewindows/article/details/6684558 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因...
  • taotaoah
  • taotaoah
  • 2016-03-26 17:23
  • 985

图文讲解QuickSort快速排序算法(Java版)

什么是快速排序? 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此...
  • IT_ZJYANG
  • IT_ZJYANG
  • 2016-11-30 14:28
  • 2920

C++简单排序算法之快速排序

快速排序是由东尼•霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n l...
  • zhengjuexi4456
  • zhengjuexi4456
  • 2016-09-20 13:03
  • 4772

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

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

【排序算法】快速排序原理及Java实现

快速排序是我们之前学习的冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的。快速排序是一种非常高效的排序算法,它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直...
  • jianyuerensheng
  • jianyuerensheng
  • 2016-04-27 09:08
  • 25194

快速排序算法的思想和几种实现方式

快速排序算法是基于分治策略的另一个排序算法。 该方法的基本思想是: 1.先从数列中取出一个数作为基准数,记为x。 2.分区过程,将不小于x的数全放到它的右边,不大于x的数全放到它的左边。(这样key的...
  • man_sion
  • man_sion
  • 2017-04-12 08:43
  • 1950

快速排序 图解算法过程

步骤一:划分 (1)选择数组的尾元素做为支点,支点选择方案有很多。 (2)把>=支点的元素放到右边。 (3)把<=支点的元素放到左边。 (4)将支点放到正确的位置。 步骤二:递归 ...
  • collonn
  • collonn
  • 2013-12-28 12:47
  • 5709

【图文解释】快速排序算法

高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。 假设我们现在对“6  1  2 7  9  3  4  5 10  8”这个...
  • guomutian911
  • guomutian911
  • 2015-11-18 20:38
  • 876

快速排序 改进快排的方法

快速排序法事应用最广泛的排序算法之一,最佳情况下时间复杂度是 O(nlogn)。但是最坏情况下可能达到O(n^2)。说明快速排序达到最坏情况的原因。并提出改善方案并实现之。 答: 改进方案:改进选...
  • lingfengtengfei
  • lingfengtengfei
  • 2013-10-07 11:32
  • 13679
    个人资料
    • 访问:6639次
    • 积分:291
    • 等级:
    • 排名:千里之外
    • 原创:23篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条