这两天笔试题看的多,感觉基本排序还是要掌握的,写篇博客谈谈我对快排的理解吧。
首先,快排快排顾名思义是一种很快速的排序方法,它是冒泡排序的改进版,下面来谈谈它的原理,快速排序是利用一个中间数(一般都去第一个数,这里命名为standard)将一堆数分为大小不同的2个部分,中间数的左边的数一定全都比右边的数小(也就是小于中间值),而右边的数全都大于中间值,然后中间值左边和右边再次进行快排,直到全部排好序为止。
下面来谈谈实现步骤:
1.首先定义i j分别为数组的第一个和最后一个数的下标
2.确定标准值,遍历数组,从右往左找,找到一个小于standard的数记为[Aj]
3.遍历数组,从左往右找,找到一个大于standard的数记为[Ai]
4.交换这两个数
5.当i=j时,把该位置和standard位置交换
6.standard左边和右边继续快排,直到排好序为止
假设要排的数组为:A[8] ={ 5 2 8 9 2 3 4 9 }
选择 standard = 5, 开始时 i=0,j=5
index 0 1 2 3 4 5
开始: 5 9 3 7 4 6
i j
第一次找 5 9 3 7 4 6
i j
交换: 5 4 3 7 9 6
i j
第二次找 5 4 3 7 9 6
ij
调整standard: 3 4 5 7 9 6
之后用递归就行。下面贴代码:
public static void kuaisu(int[] a,int low,int high){
//找到递归算法的出口
if( low > high) {
return;
}
//声明要交换的两个值的位置
int i = low;
int j = high;
//确定一个标准值
int standard = a[ low ];
//完成一趟排序
while( i< j) {
//从右往左找到第一个小于标准值的数
while(i<j && a[j] > standard){
j--;
}
//从左往右找到第一个大于标准值的数
while( i<j && a[i] <= standard) {
i++;
}
//交换 这两个数
if(i<j) {
int p = a[i];
a[i] = a[j];
a[j] = p;
}
}
//调整标准值的位置
int p = a[i];
a[i] = a[low];
a[low] = p;
//对标准值左边的数快排
kuaisu(a, low, i-1 );
//对标准值右边的数快排
kuaisu(a, i+1, high);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[]a={7,2,3,9,5,6};
//中间值
kuaisu(a,0,a.length-1);
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
}
不足之处还望指正。