当前位置: 移动技术网 > IT编程>开发语言>Java > 快速排序 java详解

快速排序 java详解

2018年11月28日  | 移动技术网IT编程  | 我要评论

1.快速排序简介:

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

2.快速排序原理:

  a.先选一个基准值(key),一般选取序列第一个数作为基准值。假设最右边的索引为j,最左边的索引为i.

  b.先从右往左比较,(进行j--)直到找到第一个比key小的数,然后把他与key进行交换。

  c.在从左往右比较,(进行i++)直到找到第一个比key大的数,然后把他与key进行交换。

  d.直到i==j,结束第一次循环。此时,key左边的数都比key小,key右边的数都比key大,原序列被分为两个子序列。

  e.递归。将这两个子序列在重复上面a,b,c,d四个步骤。

3.java代码实现

package harbin;

import java.util.scanner;

public class qsort{
    
    public static void main(string[] args){
        scanner sc = new scanner(system.in);
        system.out.println("请输入要进行排序的数列的长度: ");
        int n = sc.nextint();
        int [] a = new int[n];
        system.out.println("请输入要进行排序的数列: ");
        for(int i=0;i<n;i++){
            a[i] = sc.nextint();
        }
        int x = 0;
        int y = a.length-1;
        qsort.quicksort(a,x,y);
        
        for(int i=0;i<a.length;i++){
            system.out.print(a[i]+" ");
        }
    }
    
    public static void quicksort(int[] a,int start,int end){
        int left = start;
        int right = end;
        int key = a[start];
        
        while(left<right){
            while(left<right&&a[right]>=key){//从后向前寻找第一个比key小的值
                right--;
            }
            if(a[right]<=key){
                int temp = a[left];
                a[left] = a[right];
                a[right] = temp;
            }
            while(left<right&&a[left]<=key){//从前向后寻找第一个比key大的值
                left++;
            }
            if(a[left]>=key){
                int temp = a[left];
                a[left] = a[right];
                a[right] = temp;
            }
        }
        if(left>start){
            quicksort(a,start,left-1);
        }
        if(right<end){
            quicksort(a,right+1,end);
        }
        
    }
}

4.例子:

 

5.解释:

原序列为:49 38 66 97 39 68 

a.选取基准值为49,i=0, j=5;

b.从右向左找第一个比49小的数,发现j=4时,39<49,所以将39和49进行交换得到序列:39 38 66 97 49 68;

c.再从左向右找第一个比49大的数,发现i=2时,66>49,将66和49进行交换得到序列:39 38 49 97 66 68;

d.在重复2,3步骤得到序列为:(39 38)49 (97 66 68)基准值左边的数都比基准值小,右边的都比基准值大

e.在对左右两个子序列重复以上4步。得到38 39 49 66 68 97

 

6.说明:

快排被公认为在所有同数量级o(nlogn)的排序方法中,平均性能最好,但如果原序列为有序序列时,快排将蜕化为冒泡排序,其时间复杂度为o(n2).

快排并不稳定

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网