中午复习了一下排序,参考了书上的算法,又写了一遍,存个档。
package sort;
/**
* 快速排序
* @author pingguoliu
*
*/
public class QuikSort {
private static int account=1; // 排序次数计数
/**
* 划分
* @param list 排序数组
* @param low 低位 下标大小
* @param high 高位
*/
private static void Partition(int[] list, int low, int high) {
int temp = list[low]; // 用于保存中枢对象
int pivotkey = list[low]; // 排序对象
int bottom = low;
int top = high; // 序列的上下界,用于下次划分作为low和high
// System.out.print("第" + account + "次开始划分 :枢值=" + temp + "\t");
// Print(list);
while (low<high) { // 将比中枢值大的移植右侧,小的移植左侧
while(low<high && list[high] >= pivotkey) high--; // 从右侧遍历,忽略其中比中枢值大的
list[low] = list[high];
while (low<high && list[low] <= pivotkey) low++; // 从左侧遍历,忽略其中比中枢值小的
list[high] = list[low];
}
list[low] = temp; // 将中枢值放回
System.out.print("第" + account + "次结束划分 :枢值=" + temp + "\t");
Print(list);
account++; // 划分次数+1
// 将划分好的两个区域再次划分
if (low-1>bottom) {
Partition(list, bottom, low-1);
}
if (low+1<top) {
Partition(list, low+1, top);
}
}
/**
* 输出当前队列情况
* @param list
*/
private static void Print(int[] list) {
for(int i : list) {
System.out.print(i + "\t");
}
System.out.println();
}
public static void main(String[] args) {
int[] list = {49, 38, 65, 97, 76, 13, 27};
int low = 0;
int high = list.length-1;
Partition(list, low, high);
}
}