算法--快速排序

看别人视频自己总结的步骤,仅供自己娱乐玩耍

   大概思路: 

1.找出数组支点   办法一  随机找一个数(不怎么好  万一你找到最大或最小的呢)   办法二  取开头结尾中间三个数中中间大的数作为支点(本人采用这个办法)

2.将支点与数组的倒数第二个数交换

3.从数组左边第二个数开始找比支点小的数,从数组右边倒数第三个数开始找比支点大的数,如果找到了,并且左边的角标比右边的角标小就将这两个数交换位置.,如果左边的角标大于等于右边的角标将停止查找,再将支点与左边角标所代表的数交换位置.,此时就形成的支点比左边的数大,比右边的数小(分治法).此时一个数的位置就已经确定了.接下来的动作就是递归以上的操作..


code:

public class Quick extends BaseSort {


public static void sortPivot(int[] arr,int first,int mid,int last){
sortSwap(arr,first,mid);
sortSwap(arr,mid,last);
sortSwap(arr,first,mid);
}

public static void sortSwap(int[] arr,int before,int after){
if(arr[before]>arr[after]){
swap(arr, before, after);
}
}


public static void swap(int[] arr, int before, int after) {
int temp;
temp = arr[before];
arr[before] = arr[after];
arr[after] = temp;
}

public static int sortPartition(int[] arr,int first,int last){
int mid = (last + first)/2;
sortPivot(arr, first, mid, last);
swap(arr, mid, last-1);//将支点与倒数第二个数交换

int pivotIndex = last-1;
int pivot = arr[pivotIndex];//支点的值

int firstLeft = first+1;
int lastRight = last-2;
boolean done =false;

while(!done){
while(arr[firstLeft]<pivot)
firstLeft++;

while(pivot<arr[lastRight])
lastRight--;

if(firstLeft<lastRight){
swap(arr,firstLeft,lastRight);
firstLeft++;
lastRight--;
}else{
done = true;
}
}

swap(arr,pivotIndex,firstLeft);
pivotIndex = firstLeft;
return pivotIndex;
}

public static int[] sort(int[] arr,int first,int last){
if(last - first +1 < 4){
int mid = (first+last)/2;
sortPivot(arr,first,mid,last);
}else{
int pivotIndext = sortPartition(arr, first, last);
sort(arr,first,pivotIndext-1);
sort(arr,pivotIndext+1,last);
}
return arr;
}
public static void main(String[] args) {
int[] is = sort(array,0,array.length-1);

}

参考视频地址  http://v.youku.com/v_show/id_XMzgzMDA0Mjc2.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值