快排思想:
1 、确定基准值,(一般是取第一个)或者是取数组的中间值
2 、从后面开始查找第一个小于基准值的数,j- -操作,用j来标记数组下标;再从第二个开始,找到第一个大于基准值的数,i++操作,用i来标记,.当满足(i!=j)时,交换j和i下标对应的值,…,直到i==j时,1.基准值归位,2.将旧基准值置最终的位置。(这俩步就是交换基准值和该基准值最终位置的值,注意先后顺序),至此一次快排结束,然后递归执行基准值左边的快排,基准值右边的快排…..
1.经典款
private static void quickSort(int []a,int left,int right)
{
if(left>right)
{
return;
}
int i,j,pivot;
i=left;j=right;
pivot= a[left];
while(i!=j)
{
while(i<j && a[j]>=pivot)
{
j--;
}
if(i<j)
{
a[left] = a[j];
}
while(i<j && a[i]<=pivot)
{
i++;
}
if(i<j)
{
a[j]=a[i];
}
}
a[i]=pivot;
quickSort(a,left,i-1);
quickSort(a,i+1,right);
}
2.变化款
public class TestQuickSort {
public static void main(String[] args) {
int [] arr = {49,38,65,97,76,13,27,60,61};
quickSort(arr,0,arr.length-1);
System.out.println("排序后--");
print(arr);
}
private static void print(int[] arr) {
for(int i=0;i<=arr.length-1;i++)
{
System.out.print(arr[i]+"\t");
}
System.out.println();
}
/**
* 快排算法
* @param arr
* @param i
* @param j
*/
private static void quickSort(int[] arr, int start, int end)
{
if(start>=end)
return;
int pivot = arr[start];//基准值
int i = start;
int j = end;
while(i!=j)
{
while(i<j && arr[j]>=pivot)
{//从右开始找到都一个小的
j--;
}
while(i<j && arr[i]<=pivot)
{//找到第一个最大的
i++;
}
if(i<j)
{
swap(arr,i,j);
}
}
//先将新的基准值归位
arr[start]=arr[i];//重新确定基准值
//确定此次快排(基准元素)的元素位置
arr[i]=pivot;//确定一个元素的最后位置...
print(arr);
quickSort(arr,start,i-1);
quickSort(arr,i+1,end);
}
public static void swap(int[] arr, int i, int j)
{
arr[i] = arr[i] + arr[j];
arr[j] = arr[i] - arr[j];
arr[i] = arr[i] - arr[j];
}
}
经典款和变化款第一次快排的结果是不一样的,但是基准元素的最终位置是一致的,只是交换顺序不同罢了,经典款是一开始就交换了基准值,变化款是最后才交换基准值,不过思想是一样的…我们只要掌握思想就可以了…分治…