面试题10-快速排序

题目要求

快速排序

题目解析

思路一:

  • 分析

首先选择一个枢轴值,和两个下标值分别为low和high。
首先比较是否枢纽值与low下标所代表的值的大小,如果大于,那么检查low+1的值。
如果小于的话将low的值移动至数组右侧。
然后比较是否枢纽值与high下标所代表的值的大小,如果小于,那么检查high-1的值。
如果小于的话将low的值移动至数组左侧。
再分别在分开的两个区间进行快速排序

  • 代码段
public static int[] order(int[] data) {
        
        if(data == null || data.length == 0) {
            return null ;
        }
        
        //确定中间值为枢轴值
        int tempId = (data.length - 1 + 0 ) / 2 ;
        int temp = data[(data.length - 1 + 0 ) / 2] ;
        
        int low = 0 ;
        int high = data.length-1 ;
        
        //移动元素完成一波快速排序
        while(low < high) {
            while(low < tempId && data[low] <= temp) {
                low ++ ;}
            data[tempId] = data[low] ;
            tempId = low ;
            low++ ;
            while(tempId < high && data[high] >= temp) {
                high -- ;}
            data[tempId] = data[high] ;
            tempId = high ;
            high-- ;
        }
        
        data[tempId] = temp ;
        
        //处理枢轴左边的数组区间
        if(tempId > 0) {
            int[] leftData = order(Arrays.copyOfRange(data, 0 , tempId)) ;
            
            for(int i = 0 ; i < tempId ; i++ ) {
                data[i] = leftData[i] ;
            }
        }
        //处理枢轴右边的数组区间
        if(tempId+1 < data.length ) {
            int[] rightData = order(Arrays.copyOfRange(data, tempId+1 , data.length)) ;
            
            for(int i = tempId+1 ; i < data.length ; i++) {
                data[i] = rightData[i - (tempId+1)] ;
            }
        }
        
        return data ;
        
    }

测试代码

public static void main(String[] args) {
        
        int[] data = {46,68,12,25,33,80,19,33} ;
        
        data = order(data) ;
        if(data != null)
        for(int i = 0 ; i < data.length ; i++) {
            System.out.print( data[i] + ((i==data.length-1) ? "":",") );
        }
        
    }

运行结果

t排序前
46,68,12,25,33,80,19,33

>>>>>>>>>>>>>>>>>>>>>>>>>>
排序后
12,19,25,33,33,46,68,80


看完整源码戳源码地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、常见排序算法一览: 时间复杂度: 是一个函数,它定量描述了该算法的运行时间。 空间复杂度:一个算法在运行过程中...
    夕望有你阅读 4,449评论 0 0
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 10,594评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 9,090评论 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 5,031评论 0 2
  • 转自:http://blog.csdn.net/jackfrued/article/details/4492194...
    王帅199207阅读 12,753评论 3 93

友情链接更多精彩内容