=========基础======
package sss;
import java.util.Arrays;
import java.util.Random;
/**
* @version 1.0
*
* @author DongXiang
*
* @action 快速排序优化: 可以扩展到对象排序
*
* @time 2017年7月18日下午2:22:59
*
*/
public class QuickSort {
public static int partition(int[] array, int lo, int hi) {
// 三数取中
int mid = lo + (hi - lo) / 2;
if (array[mid] > array[hi]) {//若m大于 h ,则 m 和 h 交换
swap2(array,mid,hi);
}
if (array[lo] > array[hi]) {//若l大于 h ,则 l 和 h 交换
swap2(array,lo,hi);
}
if (array[mid] > array[lo]) {//若m大于 l ,则m 和 l 交换 error
swap2(array,mid,lo);
}
int key = array[lo];//l
while (lo < hi) {//l-index= key && hi > lo) {// 找出l-h之间小的 > 大的 位置
hi--;
}
array[lo] = array[hi];//把小的赋给低的,
while (array[lo] <= key && hi > lo) {
lo++;
}
array[hi] = array[lo];
}
array[hi] = key;
return hi;
}
public static void swap2(int[]array,int a, int b) {
System.out.println("a = "+a+";b = "+b+";array="+Arrays.toString(array));
int temp = array[a];
array[a] = array[b];
array[b] = temp;
System.out.println("a = "+a+";b = "+b+";array="+Arrays.toString(array));
}
// 插入算法 start===================
public static void insertSort(int[] arr) {
int i, j;
int n = arr.length;
int target;
// 假定第一个元素被放到了正确的位置上
// 这样,仅需遍历1 - n-1
for (i = 1; i < n; i++) {
j = i;
target = arr[i];
while (j > 0 && target < arr[j - 1]) {
arr[j] = arr[j - 1];
j--;
}
arr[j] = target;
}
}
// 插入算法 end===================
public static void quickSort(int[] array, int lo, int hi) {//0-max Index
if (lo >= hi) {
return;
}
int index = partition(array, lo, hi);
quickSort(array, lo, index - 1);
quickSort(array, index + 1, hi);
}
/**快速排序在序列中元素很少时,效率将比较低,不然插入排序,因此一般在序列中元素很少时使用插入排序,这样可以提高整体效率。
* @param array
* @param lo 第一个基准值的位置:
* @param hi 第二基准值的位置:lo0) {
flag=true;
}
}
System.out.println(sb);
System.out.println(flag);
System.out.println("=================");
quickUpdate(arryRandom, 0, arryRandom.length-1);
System.out.println("=================");
sb=new StringBuffer();
flag=false;
for (int i = 0; i < arryRandom.length; i++) {
sb.append(arryRandom[i]+"\t");
if ((i+1)%50==0) {
sb.append("\n");
}
if (((i+1)0) {
flag=true;
}
}
System.out.println(sb);
System.out.println(flag);
}
}
package sss;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Random;
/**
* @version 1.0
*
* @author DongXiang
*
* @action 快速排序优化: 可以扩展到对象排序
*
* @time 2017年7月18日下午2:22:59
*
*/
public class QuickSort2List {
public static > int partition(List arrayList, int lo, int hi) {
// 三数取中
int mid = lo + (hi - lo) / 2;
if (arrayList.get(mid).iComparable(arrayList.get(hi))>0) {
// if (arrayList[mid] > arrayList[hi]) {
swap2(arrayList,mid, hi);
// swap(arrayList[mid], arrayList[hi]);
}
if (arrayList.get(lo).iComparable(arrayList.get(hi))>0) {
// if (arrayList[lo] > arrayList[hi]) {
swap2(arrayList,lo, hi);
// swap(arrayList[lo], arrayList[hi]);
}
if (arrayList.get(mid).iComparable(arrayList.get(lo))>0) {
// if (arrayList[mid] > arrayList[lo]) {
swap2(arrayList,mid, lo);
// swap(arrayList[mid], arrayList[lo]);
}
System.out.println("arrayListTTT = "+arrayList);
E key = arrayList.get(lo);
System.out.println("E-key="+key);
// int key = arrayList[lo];
while (lo < hi) {
while (arrayList.get(hi).iComparable(key) >= 0 && hi > lo) {
// while (arrayList[hi] >= key && hi > lo) {
hi--;
}
arrayList.set(lo, arrayList.get(hi));
// arrayList[lo] = arrayList[hi];
while (arrayList.get(lo).iComparable(key)<=0 && hi > lo) {
// while (arrayList[lo] <= key && hi > lo) {
lo++;
}
arrayList.set(hi, arrayList.get(lo));
// arrayList[hi] = arrayList[lo];
}
arrayList.set(hi, key);
// arrayList[hi] = key;
return hi;
}
public static > void swap2(List arrayList, int a,int b) {//进行两个对象的值,进行交换;实际
System.out.println(String.format(Locale.getDefault(),
"arrayList[%d]=%s;arrayList[%d]=%s",
a,arrayList.get(a),b,arrayList.get(b)));
E keyT = arrayList.get(a);
arrayList.set(a, arrayList.get(b));//arrayList.add(index, element);
arrayList.set(b, keyT);
System.out.println(String.format(Locale.getDefault(),
"arrayList[%d]=%s;arrayList[%d]=%s",
a,arrayList.get(a),b,arrayList.get(b)));
}
// 插入算法 start===================
public static > void insertSort(List arrayList) {
int i, j;
int n = arrayList.size();
E target;
// 假定第一个元素被放到了正确的位置上
// 这样,仅需遍历1 - n-1
for (i = 1; i < n; i++) {
j = i;
target = arrayList.get(i);
while (j > 0 && target.iComparable(arrayList.get(j - 1))<0 ) {
// while (j > 0 && target < arr[j - 1]) {
arrayList.set(j, arrayList.get(j- 1));
// arr[j] = arr[j - 1];
j--;
}
arrayList.set(j,target);
// arr[j] = target;
}
}
// 插入算法 end===================
public static > void quickSort(List arrayList, int lo, int hi) {
if (lo >= hi) {
return;
}
int index = partition(arrayList, lo, hi);
quickSort(arrayList, lo, index - 1);
quickSort(arrayList, index + 1, hi);
}
/**快速排序在序列中元素很少时,效率将比较低,不然插入排序,因此一般在序列中元素很少时使用插入排序,这样可以提高整体效率。
* @param array
* @param lo 第一个基准值的位置:
* @param hi 第二基准值的位置:lo> void quickUpdate(List arrayList, int lo, int hi) {
if (hi - lo + 1 < 10) {
insertSort(arrayList);
} else {
quickSort(arrayList, lo, hi);
}
}
public static void main(String[] args) {
List arryRandom=new ArrayList();
QObj tq=null;
int tempSize=11;
Random random=new Random();
for (int i = 0; i < tempSize; i++) {
tq=new QObj();
tq.setName("张三"+i);
tq.setAge(random.nextInt(100+1));
arryRandom.add(tq);
}
StringBuffer sb=new StringBuffer();
boolean flag=false;
for (int i = 0; i < arryRandom.size(); i++) {
sb.append(arryRandom.get(i)+"\t");
if ((i+1)%1==0) {
sb.append("");
}
if (((i+1)0) {
flag=true;
}
}
System.out.println(sb);
System.out.println(flag);
System.out.println("======================");
quickUpdate(arryRandom, 0, arryRandom.size()-1);
System.out.println("======================");
sb=new StringBuffer();
flag=false;
for (int i = 0; i < arryRandom.size(); i++) {
sb.append(arryRandom.get(i)+"\t");
if ((i+1)%1==0) {
sb.append("");
}
if (((i+1)0) {
flag=true;
}
}
System.out.println(sb);
System.out.println(flag);
}
public interface IComparable{
public int iComparable(T other);
}
}
package sss;
import sss.QuickSort2List.IComparable;
/**
* @version 1.0
*
* @author DongXiang
*
* @action 对象
*
* @time 2017年7月18日下午5:23:49
*
*/
public class QObj implements IComparable{
private String name=null;
private int age=0;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "QObj [name=" + name + ", age=" + age + "]\n";
}
@Override
public int iComparable(QObj other) {
return this.getAge()-other.getAge();
}
}