快速排序原理:
将需要排序的数组按照一个数(可以是其中任意一个数),把比其小的数放在左边,比其大的数放在右边;然后将其左右两边边的数看成新的数组,继续这样排列,直到每个区域里只有两个数。
将数组按照一个数分为大小两边-->实现方法:(理论)
如有一个数组arr = {9 , 1 , 8 , 7 , 5 , 10 , 3, 6 }
将arr[0] 作为参照数->temp = arr[0]; arr[0]作为第一个空位(*将arr[0] 的值赋给了temp ,则arr[0]的位置可以看为一个空位:可以将其它的值放入此地)
左边int i = 0 ; 右边 int j = arr.length - 1;
第一步:将数组从右往左与参照数temp比较(arr[7] = 6 < temp=9 ),发现比其小的值是 放入第一个空位中 。arr[0] = arr[7]; 则arr[7]作为第二个空位
第二步:将数组从左往右与参照书temp比较(arr[5]=10 >temp = 9 ),发现比其大的数放在第二个空位中。arr[7] = arr[5]
此时左边i = 1 ; 右边j = 6; 数组为 temp = 9 {6,1,8,7,5,空,3,10};
以此类推,左边i =1 ,右边j=6
j->i 找到比temp小的数 ,arr[6]=3<temp=9 ;则 arr[5]=arr[6] ,{6,1,8,7,5,3,空,10} . arr[6]成为空位;
i->j 找到比temp大的数,发现右边已经没有比temp大的数了。第一轮排序完毕。
将temp赋给空位空。arr[6] = temp;
按照此方法开始第二轮的排列。第三轮。。。
源代码:
l为left 左边的第一个下标
r为right右边的最后一个下标
public static int [] quicksort(int arr[],int l,int r){
if(r>l) {
int i=l;
int j=r;
int temp=arr[l];
while(i<j){
while(i<j&&arr[j]>temp)
j--;
if(i<j){
arr[i++]=arr[j];
}
while(i<j&&arr[i]<temp)
i++;
if(i<j){
arr[j--]=arr[i];
}
}
arr[i]=temp;
quicksort(arr,l,i-1);
quicksort(arr,i+1,r);
}
return arr;
}