快速排序

冒泡排序缺点:

  数据比较是相邻单元,每次交互移动一位,上次比较过得数据再下次可能再次比较,产生冗余比较。导致冒泡排序的总比较次数和交换次数比较多。

该进点:

  将数据分组,组内无序,组间有序。从而减少冗余比较次数和移动次数

便于编程:

  取划分端首元素,俩端向中间烧苗的方法

  空单元在一侧,则指针从另一侧开始扫描

代码实现案例:

 

package cn.com;

import java.util.Arrays;

/**快速排序
 *     本例子按照从小到大的顺序
 * 
 * @author Administrator
 *
 */
public class QuickSort {
    public static void main(String[] args) {
        int[] array = {90,193,200,2,4,65,89,20,190,23};

        doSort(array, 0, array.length-1);
        System.out.println(Arrays.toString(array));
    }
    
    /**递归排序每个分组内的数据
     * @param array 待排数组
     * @param i 每个分组的起始下标
     * @param j 每个分组的结束下标
     */
    public static void doSort(int[] array,int i,int j){
        if (i<j) {
            int k = sortInGroup(array, i, j);//获取第一次划分完成后划分元素的 位子
            doSort(array, i, k-1);//递归划分左半段
            doSort(array, k+1,j);//递归划分右半段
        }
    }
    /**实现组内排序的方法
     * @param array 待排序数组
     * @param begin 起始位子
     * @param end 结束位子
     * @return 分组完毕后,分组元素在数组中的位子。这个地方采用直接返回的方式就好了,Integer是不可变的,所有实现不了引用传递的效果
     */
    public static int sortInGroup(int[] array,int begin,int end){
        int x = array[begin];//方便编程取第一个为划分元素
        int i = begin;
        int j = end;
        //开始空位在左边,扫描j,比标志大的不动,小的移动位子到空位处,i+1;
        //之后空格在右边,扫描i,比标志小的不动,大的移动位子到空位处,j-1;
        //循环里面先扫描右边,扫描的时候又是一层循环
        //再扫描左边
        do {
            while ((x<=array[j])&&(i<j)) {
                j--;
            }
            if (i<j) {
                array[i++] = array[j];
            }
            while ((x>array[i])&&(i<j)) {
                i++;
            }
            if (i<j) {
                array[j--]=array[i];
            }
        } while (i<j);//相等的时候说明分组完毕退出
        array[i] = x;//划分元素就位
        return i;
    }
    
}

 

转载于:https://www.cnblogs.com/wanjn/p/8922786.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值