快速排序的基本实现思想:
- 选取数组的第一个元素作为基准值key。
- 从数组最后一个元素high开始依次向前与key进行比较分区,将不小于key的数全放到它的右边,不大于key的数全放到它的左边。
- 比较交换之后以key下一个元素为基准再对左右区间重复第二步,直到各区间只有一个数
算法的具体实现:
根据基本思想描述,在上图已经标出了key和最后一个元素high
key开始与最后一个元素比较,也就是4与34比较,因为思想中需要将不小于key的数全放到它的右边,所以4比34小会继续与33进行比较,以此类推,当比较到3时,key与3进行交换,key为索引0不变,重新从最后一个元素从后往前进行比较,直到这个key右边全是比它大的数。从图中做了标记,no表示不交换,yes表示交换。
根据思想key为下一个元素,重复上面的步骤。
只能与4进行交换,下面是交换结果:
key为索引2时,没有发生交换,因为右边都是大于索引2的数。
既然没有交换,则key的索引+1
交换之后,key索引保持不变,继续与最后一个索引进行比较,以此类推。
最后的交换成果:
key索引继续+1,在进行比较,因为原理一样,就不再阐述了,而且举例的这个数组已经排序完了,所以直接显示最终的排序结果:
代码实现如下:
//low是定义一个变量作为key
//high为数组最后一个元素
public static void sort(int[] arr,int low,int high){
int i,j,key,t;
if(low>high){
return;
}
i=low;
j=high;
//key就是基准位
key = arr[low];
while (i<j) {
//先看右边,依次往左递减
while (key<=arr[j]&&i<j) {
j--;
}
//再看左边,依次往右递增
while (key>=arr[i]&&i<j) {
i++;
}
//如果满足条件则交换
if (i<j) {
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
//最后将基准为与i和j相等位置的数字交换
arr[low] = arr[i];
arr[i] = key;
//递归调用左半数组
sort(arr, low, j-1);
//递归调用右半数组
sort(arr, j+1, high);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr =new int[]{4,12,3,52,15,33,34};
sort(arr,0,6);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
得到如下结果: