找一个枢轴,小于枢轴的都放在枢轴左边,大于枢轴的都放在枢轴右边,然后枢轴两侧进行递归操作。
时间复杂度:最好:o(nlogn)最差:o(nˆ2)
代码:
public class QuickSort {
private int[] paraL;
public QuickSort(){}
public void show(){
System.out.println("排序后的记录为:");
for(int para:paraL){
System.out.print(para+" ");
}
System.out.println();
}
private int position(int low,int high){//获取枢轴
int value = paraL[low];//枢轴
while(low<high){
while(low<high&&value<=paraL[high]){//从右往左,第一个小于枢轴的置于最小的位置
high--;
}
paraL[low] = paraL[high];
while(low<high&&value>=paraL[low]){//从左往右,第一个大于枢轴的置于最大位置
low++;
}
paraL[high] = paraL[low];
}
paraL[low] = value;//将保存的枢轴变量返回,此时low==high
return low;
}
public void qSort(int low,int high){//开始快速排序
if(low<high){//这儿要加限制条件,确保长度>1,一个元素有什么可以排序的是吧
int position = position(low,high);//得到枢轴
qSort(low,position-1);//枢轴左排序
qSort(position+1,high);//枢轴右排序
}
}
public static void main(String[] args){
int[] paraL = {9,8,7,6,5,4,3,2,1};
QuickSort qs = new QuickSort();
qs.setParaL(paraL);
qs.qSort(0, paraL.length-1);//array的长度不带括号arrayName.length;
qs.show();
}
public int[] getParaL() {
return paraL;
}
public void setParaL(int[] paraL) {
this.paraL = paraL;
}
}
20160802再写一遍:
public class QuickSort {
public int[] data;
public void sort(int begin, int end){
if(begin >= end){
return;
}
int first = begin;
int last = end;
int value = data[first];//作为枢轴
while(first < last){
while(first < last && value <= data[last]){//从后往前找到第一个小于枢轴的元素
last--;
}
data[first] = data[last];
while(first < last && value >= data[first]){//从前往后找到第一个大于枢轴的元素
first++;
}
data[last] = data[first];
}
data[first] = value;//这个时候first左边的都小于first元素的值,first右边的元素都大于first元素的值,左边和右边进行递归
show();
sort(begin, first-1);
sort(first + 1, end);
}
private void show(){
for(int temp: data){
System.out.print(" " + temp);
}
System.out.println();
}
public static void main(String[] args) {
QuickSort qs = new QuickSort();
int[] data = new int[]{1, 3, 5, 2, 4, 4, 1, 2};
qs.data = data;
qs.sort(0, data.length-1);
}
}