快速排序思想:
总体思想:每次递归确定一个数(一般都是第一位数)的正确位置,使得比它小的都在它的前面、比它大的都在它的后面,再把该数组从这个数分为前后两半,进入递归。
具体逻辑:得到一个数组,将数组的第一个值令为基值(key),然后从最后一位(end)开始向前搜索,若end所指向的值小于key,则将第一位(也就是start,start初始值就是第一位)与end位交换值,交换一次后end位为key值(key值未变,变的是索引值)。
再从第一位(start)向后搜索,若start所指向的值大于key,则将start与end值交换(由上一步可知此时end值为key,执行完此步之后start位值为key)。
再执行从后往前的搜索比较,依次循环。
当start与end重合时,此次循环结束,这时key的左边都是小于key的,key的右边都是大于key的(key值位置已确定,左右两部分都不包括key值的位置)。然后进行递归,将key的左半部分和右半部分再次调用本函数,与上一次不同的是传入的start或end索引值变了,当数组切割到不能再小时(start无法继续左移或者end无法右移)递归结束。
这个是我写的快速排序的demo,第一次发博客,欢迎大佬们前来批评,每周回复。
import java.util.Scanner;
public class Main{
public static int key;
public static int end;
public static int start;
static int temp;
public static void main(String[] args) {
int[] a = {2,2,6,4,9,8,7,3,1,23,12};
start = 0;
end = a.length-1;
sort(a,0,a.length-1);
System.out.println(a);
for(int b:a) {
System.out.println(b);
}
}
private static void sort(int[] a,int low,int high) {
start = low;
end = high;
key = a[low];
while(end>start){
while(end>start&&a[end]>=key)
end--;
if(a[end]<=key) {
temp = a[start];
a[start] = a[end];
a[end] = temp;
}
while(end>start&&a[start]<=key)
start++;
if(a[start]>=key) {
temp = a[start];
a[start] = a[end];
a[end] = temp;
}
}
if(start>low) sort(a,low,start-1);
if(end<high) sort(a,end+1,high);
}
}