快速排序
排序思想
通过对数据元素集合Rn 进行一趟排序划分出独立的两个部分。其中一个部分的关键字比另一部分的关键字小。然后再分别对两个部分的关键字进行一趟排序,直到独立的元素只有一个,此时整个元素集合有序。
所有比R[low]小的放前面,所有比R[low] 大的放后面,然后以R[low]为分界,对R[low … high] 划分为两个子集和,再做划分。直到low >= high 。
实现的代码
- 第一个文件(Main.java)
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("please input the data,press \"CTRL+Z\" to end input");
ArrayList<Integer> a = new ArrayList<Integer>();
while(sc.hasNextInt()){
int temp;
temp= sc.nextInt();
a.add(temp);
}
new Functions().showAll(a);
new Functions().quickSort(a,0,a.size()-1);
new Functions().showAll(a);
}
}
- 第二个文件(Functions.java)
package com.dlut.quickSort;
import java.util.ArrayList;
import java.util.Iterator;
public class Functions {
void quickSort(ArrayList<Integer> a,int left,int right){
int tleft;
int tright;
int temp;
tleft= left;
tright = right;
int key = a.get(tleft);
while(tleft<tright){
while(tleft<tright&&a.get(tright)>key){
tright--;
}
a.set(tleft, a.get(tright));
while(tleft<tright&&a.get(tleft)<key){
tleft++;
}
a.set(tright,a.get(tleft));
if(tleft==tright){
a.set(tleft, key);
}
if(left<tright){
quickSort(a,left,tleft-1);
}
if(tleft<right){
quickSort(a,tright+1,right);
}
}
}
public void showAll(ArrayList<Integer> a){
System.out.println("please show the data");
Iterator<Integer> it = a.iterator();
while(it.hasNext()){
System.out.print(it.next()+"\t");
}
System.out.println();
}
}
运行结果
和其他的排序方式比较
总结
快速排序:不稳定
时间复杂度:nlogn