思路:
基准数:根据基准数分组,分成两组,左边的都比基准数小,右边的都比之大,分组以后,对组内进行排序。
选基准数:通常选择第一个
范例:
45 28 80 90 60 16 100 10
选基准数:45
从序列的后面往前找,找到比基准数小的交换位置
10 28 80 90 60 16 100 45
从序列的前面往后找,找到比基准数大的交换位置
10 28 45 90 60 16 100 80
重复操作:
10 28 16 90 60 45 100 80
10 28 16 45 60 90 100 80
直到符合上边的基准规则:
{10 28 16} 45 { 60 90 100 80 }
然后对每个组再次进行排序
实现:
/**
* 冒泡排序
*/
public class A {
public static void main(String[] args) {
int[] a = {45,28,80,90,60,16,100,10};
sort(a,0,a.length-1);
for (int i = 0,len = a.length; i < len ; i++) {
System.out.print(a[i]+" ");
}
System.out.println();
}
public static void print(int[] arr){
for (int i = 0,len = arr.length; i < len ; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
}
public static void sort(int[] arr,int left,int right){
int ll = left;
int rr = right;
int base = arr[left];
while (ll < rr){
while ( ll < rr && arr[rr] > base){
rr--;
}
if ( ll < rr ){
int temp = arr[rr];
arr[rr] = arr[ll];
arr[ll] = temp;
ll++;
}
print(arr);
while ( ll < rr && arr[ll] < base){
ll++;
}
if ( ll < rr ){
int temp = arr[rr];
arr[rr] = arr[ll];
arr[ll] = temp;
rr--;
}
print(arr);
}
if ( ll > left ) {
sort(arr,left,ll-1);
}
if ( rr < right){
sort(arr,ll+1,right);
}
}
}