對於A數組,分解成A[p…r]-> A[p…q-1] A[P] A[q+1…r]
僞代碼:
QUICKSORT(A,p,r)
if p<r:
q=PARTITION(A,p,r)
QUICKSORT(A,p,q-1)
QUICKSORT(A,q+1,r)
PAETITION(A,p,r)
x = A[r]
i = p -1
for j=p to r-1:
if A[j] <= x
i = i + 1
exchange A[i] with A[j]
exchange A[i+1] with A[r]
return i+1
public class P_quicksort {
private static int GetBestI(int[] a,int left,int right){
int x = a[right];
int i = left-1;
for(int j = left ;j <= right -1 ;j ++){
if (a[j] <= x){
i++;
int temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
int temp = a[i+1];
a[i+1] = a[right];
a[right] = temp;
return i+1;
}
public static void Quicksort(int[] a,int left,int right){
if (left<right){
int q = GetBestI(a,left,right);
Quicksort(a,left,q-1);
Quicksort(a,q+1,right);
}
}
public static void main(String[] args){
P_quicksort quick = new P_quicksort();
int [] a = {10,9,8,6,5,4,3,2,1};
Quicksort(a,0,a.length-1);
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
}
}
C++實現
//
// QuicksortTest.cpp
// algorithm
//
// Created by mac on 2019/9/15.
// Copyright © 2019 Mao. All rights reserved.
//
#include <stdio.h>
#include<iostream>
using namespace std;
int getBestI(int a[],int left,int right){
int X = a[right];
//int M = left - 1;
int i = left - 1;
for(int j = left;j<=right-1;j++){
if(a[j] <= X){
i++;
swap(a[j], a[i]);
}
}
swap(a[i+1], a[right]);
return i+1;
}
void Quicksort(int a[],int left,int right){
if (left<right){
int q =getBestI(a,left,right);
Quicksort(a, left, q-1);
Quicksort(a, q+1, right);
}
}
int main(){
int a[] = {10,9,8,7,6,5,4,3,2,1};
Quicksort(a, 0, 10);
for(int i = 0;i<10;i++){
cout<<a[i]<<"\t";
}
cout<<endl;
return 0;
}
推導過程
效果
java
c++