快速排序算法步骤:
1.选择一个基数。
2.把i和j想象成两个巡逻员,一个巡逻员从数组最右边的数向左寻找比基数小的数,找到后暂时停止寻找。另一个从数组最左边向右寻找比基数大的数,找到后暂停寻找。
3.交换步骤2找到的两个数。
4.继续2步骤,直到两个巡逻员碰面。把基数和他们碰面的那个位置数字兑换位置。这时他们的左边数字都不大于基数,右边的数字都不小于基数。
5.以他们碰面的位置为中心,把原数组分成左右两个新数组。然后两个数组重复巡逻员探测的过程。这样迭代下去最终所有的数字都按照从小到大的顺序排列了。
public class Test {
private static int number[];
public static void quickSort(int left, int right){
if(left > right)
return;
int i = left;//左下标
int j = right;//右下标
int temp = number[i];//存放基数
while(i != j){
//左边第一个比基数大的数的下标
while(number[i] <= temp && i < j){
i++;
}
//右边第一个比基数小的数的下标
while(number[j] > temp && i < j){
j--;
}
//两数交换
int t = number[i];
number[i] = number[j];
number[j] = t;
}
//现在i=j了,他们在数组的某个位置会和了,这个位置左边所有的数小于基准数,右边的数都大于基准数字
//把基准数字从数组的左边移动到i和j会和的位置
number[left] = number[i];
number[i] = temp;
//递归调用,让左右两边两个数组重复刚才的动作
quickSort(left, j-1);
quickSort(j+1, right);
}
public static void main(String[] args) {
Random random = new Random();
number = new int[10_0000];
for(int i = 0; i < number.length; i++){
number[i] = random.nextInt(10000);
}
long startTime = System.currentTimeMillis();
quickSort(0, number.length - 1);
System.out.println("结束时间:" + (System.currentTimeMillis() - startTime));
for(int i = 1; i < 100; i++){
System.out.println(number[i * 1000]);
}
}
}