快速排序:
将数据列表进行分区,然后对分区进行递归式排序,从而完成对整个列表的排序。排序策略:
1.选择一个列表元素作为分区元素;2.分割该列表,使小于分区元素的值位于分区元素左边,大于分区元素的值位于分区元素右边;
3.将上述两个步骤递归用于两个分区;
4.直到一个分区只含有一个元素,其内在就已经排好序了。
例子:
初始:305 65 7 90 120 110 8将90作为分区元素,重新组织列表得到:8 65 7 90 120 110 305
再对分区元素左右两边递归进行快速排序。
Code:
/*
*Created on 2016年7月10日
*Copyright 2016 Yong Cai Limited crop. All Rights Reserved
*
*/
package org.cy.sort;
public class QuickSort {
public static void main(String[] args) {
String[] str = {"f","qq","wei","chat","phone","nba"};
printArr(quickSort(str));
}
public static <T extends Comparable<? super T>> T[] quickSort(T[] data){
quickSort(data,0,data.length - 1);
return data;
}
public static <T extends Comparable<?super T>> T[] quickSort(T[] data, int minIndex, int maxIndex){
if(minIndex < maxIndex){
int partitionIndex = partition(data, minIndex, maxIndex);
quickSort(data, minIndex, partitionIndex - 1);
quickSort(data, partitionIndex + 1, maxIndex);
}
return data;
}
public static <T extends Comparable<? super T>> int partition(T[] data, int minIndex, int maxIndex){
int left;
int right;
int mid = (minIndex + maxIndex) / 2;
T partitionElem = data[mid];
swap(data, mid,minIndex);
left = minIndex;
right = maxIndex;
while(left < right){
while(left < right && data[left].compareTo(partitionElem) <= 0){
left++;
}
while(data[right].compareTo(partitionElem) > 0){
right--;
}
if(left < right){
swap(data, left, right);
}
}
swap(data, minIndex, right);
return right;
}
public static <T> void swap(T[] data, int pos1, int pos2){
T tmp;
tmp = data[pos1];
data[pos1] = data[pos2];
data[pos2] = tmp;
}
public static <T> void printArr(T[] data){
int len = data.length;
for(int i = 0; i < len; i++){
System.out.print(data[i] + " ");
}
System.out.println();
}
}