2020-05-28数据结构与算法-快速排序
算法原理:
(1)首先找到一个分界值(一般找第一个索引对应的值)
(2)把比分界值小的数放在分界值左边,大或等于的数放在分界值右边
(3)重复2的步骤,直至分解完。
(4)把最后排好序的两边数据合拼在一起就可以了
切分原理:
(1)首先是设置一个分界值和两个指针,左指针(往右移)和右指针(往左移)
(2)左指针找到一个比分界值大的数,停止,左指针找到比分界值小的数,停止,交换两个数,继续这个操作
(3)直到左指针的值大于右指针的值时,结束。
package quick_sort;
import java.util.*;
public class quick {
public static boolean less(Comparable u,Comparable v) { //判断u是否小于v
return u.compareTo(v)<0;
} //比较两个数的大小,若小于,则输出1,若大于则输出0
public static void exchange(int [] a,int i,int j) {
int temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
public static void sort(int [] a) { //对数组内的元素进行排序
//定义一个lo索引和一个hi索引 初始化辅助数组
// Comparable [] assist = new Comparable[a.length]; //
int lo=0; //最低位索引
int hi=a.length-1; //最高位索引
//调用sort重载方法
sort(a,lo,hi);
}
private static void sort(int [] a,int lo,int hi) { //对数组内的元素索引lo到索引hi进行排序
if(lo>=hi) {
return ;
} //数据不合理直接返回
//分组
int partition=partition(a,lo,hi);
sort(a,lo,(partition-1));
sort(a,(partition+1),hi);
}
private static int partition(int [] a,int lo,int hi) {
if(lo>=hi) {
return -1;
} //安全性校验
//确定分界值
Comparable key=a[lo];
//定义两个指针,分别指向最大索引处的下一个值和最小索引处的下一个值
int left=lo;
int right=hi+1;
//切分
while(true) {
//right向左移动,找到一个比分界值小的元素,停止
while(less(key,a[--right])) {
if(right==lo) {
break;
}
}
//left向右移动,找到一个比分界值大的元素,停止
while(less(a[++left],key)) {
if(right==hi) {
break;
}
}
//判断left是否大于等于right,如果是,则扫描结束,结束循环,交换元素即可
if(left>=right) {
break;
}else {
exchange(a,left,right);
}
}
//交换分界值
exchange(a,lo,right);
return right;
}
}
package quick_sort;
import java.util.Arrays;
public class quick_test {
public static void main(String[] args) {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
int [] a= {1,4,5,6,8,9,3,2};
quick.sort(a);
System.out.println(Arrays.toString(a));
}
}