快速排序
/* 快速排序
* 原理:思想上来看就是每轮选定一个基准点,将小于基准点的元素放在基准点前
* 将大于基准点的元素放在基准点之后。不断的切分原有的区间,当每个区间
* 最小时,就保证了整个数列时有序的。
* 实现:快速排序的实现分为两部分,左小右大的简单排序以及递归切分区间。
*
* */
public class QuictSort {
/* 默认选中0号元素为基准点,left为左边界初始指向array[1],right为右边界初始指向array[length-1]
* 从right开始向前遍历,如果right指向元素大于基准,right--,否之right停止移动。
* 接着开始移动left,当left所指小于基准时left后移,否则left停止移动
* 当left、right都停止移动时,交换left和right指向的元素,
* 当left、right指向同一元素时交换left、right所指与基准所指。
* 需要注意的是,初始移动的指针一定是原理基准的那个
* 例如:当基准为首元时,先移动right后移动left,否则在执行最后一部操作,
* 交换基准与left、right所指会出错。
* */
public int split(int[] array, int left, int right) {
int begin = left-1;
while(left!=right) {
while(right > left && array[begin] < array[right]) {
right--;
}
while(right > left && array[begin]>array[left]) {
left++;
}
int temp = array[left];
array[left] = array[right];
array[right] = temp;
}
if(array[begin]>=array[right]) {
int temp = array[begin];
array[begin] = array[right];
array[right] = temp;
}
return right;
}
public void quickSort(int[] array, int left, int right) {
if(left<right) {
for (int i : array) {
System.out.print(i+" ");
}System.out.println("整串");
for (int i = left-1; i <= right; i++) {
System.out.print(array[i]+" ");
}System.out.println("当前排序串");
System.out.println("当前基准"+array[left-1]);
int b = split(array, left, right);
//System.out.println(b);
quickSort(array, left, b-1);
quickSort(array, b+2, right);
}
}
public static void main(String[] args) {
int[] array = {13,3,5,8,1,11,2,12,9,4,14,7,6};
QuictSort sort = new QuictSort();
sort.quickSort(array, 1, array.length-1);
for (int i : array) {
System.out.print(i+" ");
}
}
}