快速排序

快速排序

  • 归并是先一步步分到最小块,再归并归并归并归并
  • 快排是排序俩侧,切分,排序俩侧,切分.......直到最小块就排完了
pubilc class Quick
{
        public static void sort(Comparable[] a)
        {
            StdRandom.shuffle(a);    // 消除对输入的依赖,随机打乱并输出乱序序列
            sort(a, 0, a.length-1);
        }
        private static void sort(Comparable[] a, int lo, int i)
        {
            if(hi<=ho)    return;
            int j = partition(a, lo, hi);  //见后面的切分
            sort(a, lo, j-1);
            sort(a, j+1, hi);    //j为切分元素不用加进去了
        }
}

  

 

  切分元素 j:先随意的选取a[lo]作为切分元素,然后从数组左端向左扫描找到一个大于等于a[lo]的数组,从数组右端扫描找到一个小于等于a[lo]的数组,然后交换这俩数组,如此扫描下去直到左右扫描数组相遇,相遇的即是切分元素,把切分元素与a[lo]交换就ok了!

 

 

private static int partiton(Comparable[] a, int lo, int hi)
{    
    int i = lo, j=hi+1;
    Comparable v = a[lo];
    while(ture)
    {
        while(a[++i]<=a[lo])    if(i==hi)    break;
        while(a[--j]>=a[lo])      if(j==lo)    break;
        if(i>=j) break;
        swap(a, i, j);    //交换a[i],a[j]的位置
    }
    swap(a, lo, j);    //交换a[lo],a[j]的位置
    return j;
}

 java完整代码

import java.util.Scanner; 
public class Main 
{
    public static void main(String[] args) 
    {
        Scanner in = new Scanner(System.in);
        int n=in.nextInt();
        int []a=new int[n];
            for(int i=0; i<n; i++)
                a[i]=in.nextInt();
            sort(a);
            for(int i=0; i<n; i++){
                System.out.print(a[i]);
                if(i!=n-1)
                System.out.printf(" ");
            }
                in.close();
            
                
    }
    private static  void sort(int[] a)
    {
        sort(a,0,a.length-1);
    }
    private static  void sort(int[] a, int lo, int hi)
    {
                if(hi<=lo)    return;
                int j = partiton(a, lo, hi);
                sort(a, lo, j-1);
                sort(a, j+1, hi);    
    }
    
    private static int partiton(int[] a, int lo, int hi)
    {    
        int i=lo, j=hi+1;
        while(true){
            while(a[++i]<=a[lo]) if(i==hi) break;
            while(a[--j]>=a[lo]) if(j==lo) break;
            if(i>=j) break;
                int temp=a[i];
                a[i]=a[j];
                a[j]=temp;  
        }
            int t=a[lo];
            a[lo]=a[j];
            a[j]=t;;    
            return j;
    }
 }

 c/c++完整代码(另一种)

 

#include<iostream>
using namespace std;

void quickSort(int *num,int left,int right)
{
    if(left>=right)
        return;
    int midNum = num[(left + right) / 2];
    int i = left;
    int j = right;
    while (i <= j)
    {
        while (num[i] < midNum)
    {
            i++;
        }
        while (num[j] > midNum)
    {
            j--;
        }
        if(i<=j) {
            swap(num[i], num[j]);
            i++;
            j--;
        }
    }
    quickSort(num,i, right);
    quickSort(num,left, j);
}

int main()
{
    int n;
    cin>>n;
    int *num=new int[n];
    for(int i=1;i<=n;i++)
    cin>>num[i];
    quickSort(num,1,n);
    for(int i=1;i<=n;i++)
    cout<<num[i]<<" ";
    return 0;
}

 java

import java.util.Scanner;

public class Main
{
    private static void QuickSort(int []a,int lo,int hi)
    {
        int i=lo,j=hi;
        if(lo>=hi)
            return;
        int midNum=a[(lo+hi)/2];
        while(i<=j)
        {
            while(a[i]<midNum)
                i++;
            while(a[j]>midNum)
                j--;
            if(i<=j)
            {
                int temp=a[i];
                a[i]=a[j];
                a[j]=temp;
                i++;j--;
            }
        }
        QuickSort(a,lo,j);
        QuickSort(a,i,hi);
    }
    /*private static void swap(int a,int b)
    {
        int temp=a;
        a=b;
        b=temp;
    }*/
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n=in.nextInt();
        int []a=new int[n];
        for(int i=0; i<n;i++)
            a[i]=in.nextInt();
        QuickSort(a,0,n-1);
        for(int i=0;i<n;i++)
            System.out.print(a[i]+" ");
    }
}

三向切分的快速排序(比较适合大量重复的数据)

public class Quick3way
{
    private static void sort(int []a,int lo,int hi)
    {
        if(lo>=hi)    return;
        int It = lo,i=lo+1;gt=i;
        while(i<=gt)
        {
            if(a[i]<a[lo])    swap(a,i++,It++);
            else if(a[i]>a[lo])    swap(a,i,gt--);
            else    i++;
        }
        sort(a,lo,It-1);
        sort(a,gt+1,hi);
        }
}

 

posted @ 2018-11-24 12:21  黄骏捷的博客  阅读(142)  评论(0编辑  收藏  举报