/**
* instruction of project
*
* @author Aruiea.com
* @ClassName FastSort
* @Version 1.0
* @Date 2020/8/2 14:48
* 快速排序思想:
* 1.先从数列中取出一个数作为基准数(简单起见就选第一个数)
* 2.分区过程:将比这个数大的数全放到他的右边,比他小的数全放到他的左边(分治)
* 3.再对左右两边的区重复第一步和第二部操作,直到各区间只有一个数(递归)
* 简单来说就是: 快速排序 = 冒泡 + 分治 + 递归
*
* 具体实现:
* 1.以a[0]为基准数
* 2.设置两个哨兵i,j。i++,j--
* 3.哨兵j先左移,一直到遇到第一个小于a[0]的数,然后等待i,i向右移动,直到找到一个大于a[0]的数。
* 然后交换这两个数的值(比他小的在左,比他大的在右)
* 4.直到i和j相遇时,交换a[0]和此时a[i]的值。
* 这样就完成了一个以a[0]元素为基准的快速排序。
* 5.然后对他的左半部分和右半部分分别进行这种操作,最终得到一个有序列表。
*/
public class QuickSort {
public QuickSort() {
// TODO Auto-generated constructor stub
}
private static void sort(int[] a, int low, int high ){
//初始化哨兵i和j的值,并以a[0]为基准,保存a[0]的值
int i = low;
int j = high;
int temp = a[low];
//当low>=high时停止排序,此时只剩下最后一个元素,不需要移动。
if(i >=j){
return;
}
//如果哨兵i和j没有相遇,就进行排序
while(i != j){
//哨兵j先从右至左寻找小于temp的值,j>i很重要
while(a[j] >= temp && j>i){
j--;
}
//然后等待哨兵i从左至右找到大于temp的值,i<j很重要
while(a[i] <= temp && i<j){
i++;
}
//哨兵各自找到了元素,并且哨兵i还在哨兵j的左边,就交换他们的值
if(i < j){
int flag = a[i];
a[i] = a[j];
a[j] = flag;
}
}
//最终i=j(上面循环对这两个元素的关系进行了限定),交换a[i]和a[low]的值
int flag2 = a[low];
a[low] = a[i];
a[i] = flag2;
//然后分别对他的左边和右边序列进行上述操作。
sort(a, low, i-1);
sort(a, i+1, high);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int a[] = new int[]{1,4,7,2,3,6,5,8};
sort(a, 0, a.length-1);
for(int k : a){
System.out.printf(" "+k);
}
}
}
数据结构note11:快速排序
最新推荐文章于 2024-01-16 22:02:51 发布