快速排序详解-java实现
admin
2024-03-22 17:08:55
0

一、快速排序

整体过程
1.先从数组中找一个数作为基准数,
2 进行分区,分区时大于这个数得全部放到右边,小于这个数得全部放到左边,等于这个数得全部放到中间(核心过程)
3再通过递归再更小得范围执行2步骤,直到递归到只有一个数

思路解析
比如针对 3 4 2 1 5 6 0 3
它的一个思路是首先有一个左边区域和右边区域,

左边区域的最靠右的起始下标为-1,右边区域的最靠左的起始下标为length-1

然后以数组最后一个数3为界限,大于这个数的都在右边,小于这个数的都在左边

首先排的时候index 为0,然后判断下标为0的数3 ==3,所以左右边界不动,index继续++
当index为1,判断下标为1的数4 4>3 ,所以右边界往右移动一位到length-2 值为0 将值为0与值为4调换位置 ======> 3 0 2 1 5 6 4 3
然后继续判断index为1 此时值为 0 0<3 所以左边界加1到0,值为3,将3与0调换位置,然后index+1 到2 ======> 0 3 2 1 5 6 4 3

当index为2时,判断下标为2的数 2<3, 所以左边界加1到1, 值为3 将 3与2
调换位置,然后index+1 到3 ======> 0 2 3 1 5 6 4 3
当index为3时,判断下标为3的数 1<3, 所以左边界加1到2 值为3 将3与1调换位置 然后index+1 到4 ======> 0 2 1 3 5 6 4 3

当index为4时,判断下标为4的数 5>3, 所以右边界往右移动一位到length-3 值为6,将值为6与值5调换位置 ======> 0 2 1 3 6 5 4 3
当index为4时,判断下标为4的数 6>3, 所以右边界往后移动一位到length-4----即下标为4,但是此这样就不满足index<右边界 所以跳出来
跳出来后将index为4的值和数组的最后一个值做交换 ===》 0 2 1 3 3 5 4 6
即结束

代码实现

public static void quickSort1(int[] arr) {if (arr == null || arr.length < 2) {return;}process(arr, 0, arr.length - 1);
}
public static void process(int[] arr, int L, int R) {if (L >= R) {return;}int[] equalE = partition(arr, L, R);process(arr, L, equalE[0] - 1);process(arr, equalE[1] + 1, R);
}// arr[L...R]范围上,拿arr[R]做划分值,
// L....R < = >
public static int[] partition(int[] arr, int L, int R) {int lessR = L - 1;int moreL = R;int index = L;while (index < moreL) {if (arr[index] < arr[R]) {lessR++;swap(arr, lessR, index);index++;} else if (arr[index] > arr[R]) {moreL--;swap(arr, moreL, index);} else {index++;}}swap(arr, moreL, R);//比如342555578 //返回3,6return new int[] { lessR + 1, moreL };  
}public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;
}

但是我们现在实现的代码整体时间复杂度为O(n^2); ->因为当数据为[0,1,2,3,4,5]==>这种情况时间复杂度是O(N^2)
所以其实是可以进行优化处理的
如何优化呢?即随机选择了一个划分值放到了最右边
整体的代码量比上面多出一行
因为是随机选择得划分值,那么打到任意一个位置,选取作为划分值得权重是一样得
这样一来根据数学推算,最后收敛于O(NlogN)

public static void quickSort3(int[] arr) {if (arr == null || arr.length < 2) {return;}process3(arr, 0, arr.length - 1);}public static void process3(int[] arr, int L, int R) {if (L >= R) {return;}swap(arr, L + (int) (Math.random() * (R - L + 1)), R);int[] equalArea = partition(arr, L, R);process3(arr, L, equalArea[0] - 1);process3(arr, equalArea[1] + 1, R);}
// arr[L...R]范围上,拿arr[R]做划分值,
// L....R < = >
public static int[] partition(int[] arr, int L, int R) {int lessR = L - 1;int moreL = R;int index = L;while (index < moreL) {if (arr[index] < arr[R]) {lessR++;swap(arr, lessR, index);index++;} else if (arr[index] > arr[R]) {moreL--;swap(arr, moreL, index);} else {index++;}}swap(arr, moreL, R);//比如342555578 //返回3,6return new int[] { lessR + 1, moreL };  
}public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;
}

关键点
把核心过程定义出来,然后左右边界求出来,之后通过递归不断的遍历下去,
就是再更小的范围上求出划分值对应得左右边界

相关内容

热门资讯

以正君臣,以笃父子的正笃字什么... 以正君臣,以笃父子的正笃字什么意思使动用法,使…关系深。笃父子,使父子间的关系深厚。正匡正笃忠实,一...
求怪物猎人p3雷狼、雌雄金银火... 求怪物猎人p3雷狼、雌雄金银火龙的攻略。雷狼很菜啊,你还是贪刀吧,气刃斩一用就用到底是不是,还是多观...
盗墓笔记第二季电视剧什么时候出 盗墓笔记第二季电视剧什么时候出盗墓笔记第二季播出时间:2016年5-6月备注:拍摄计划在年底完成,明...
书山有路勤为径,学海无涯苦作舟... 书山有路勤为径,学海无涯苦作舟。的意思?字面上看,一个人要有学问,就必须爬上书山,趟过学海.而爬上书...
最令人感动的一件事 最令人感动的一件事是 5年级 的习作 要自己写感恩母爱母亲,一个多么平凡的名字呀!但每...
有守护甜心第2部吗? 有守护甜心第2部吗?我很喜欢守护甜心,想知道有没有第2部。守护甜心只有一部,这一部共分四季,现在第四...
迁延顾步什么意思 迁延顾步什么意思形容走走退退不住回视自己动作的样子~顾指眷顾~多情的样子~“迁延顾步”出自梁元帝的《...
我想要几首关于青春、关于热爱生... 我想要几首关于青春、关于热爱生活、或者是积极向上的诗歌!因为是班级的诗歌朗诵,是全班一起上的,限时5...
猫和老鼠里 猫打碎了盘子,被主... 猫和老鼠里 猫打碎了盘子,被主人警告在打碎就要被扔出去,于是老鼠一直破坏是哪一是哪一集?猫和老鼠原版...
完美世界国际版武侠怎么加点 完美世界国际版武侠怎么加点苍穹的小弟帮帮忙各位师兄错主要加体敏捷和力量照着装备加3力1体1敏
图书编辑和期刊编辑哪个更好 图书编辑和期刊编辑哪个更好对文笔的要求一样吗87版薛宝钗87版薛宝钗
四十二章经里,有句话求教! 四十二章经里,有句话求教!饭千亿三世诸佛,不如饭一无念无住无修无证之者。这是何意啊?那是否可以理解为...
怎样培养孩子的意志力 缤纷活动 怎样培养孩子的意志力 缤纷活动把某件事从头做到尾,不管中途出现什么困难和挫折,都会有始有终地去完成,...
端午节节日风俗故事话库的读后感... 端午节节日风俗故事话库的读后感怎么写端午节节日风俗故事话库的读后感怎么写  一年一度的端午节到了,...
小兔子三瓣嘴的童话故事 小兔子三瓣嘴的童话故事很早以前,兔子的嘴不是现在这个样子,它有一张不大不小的小圆嘴。凭着一张乖巧的小...
贵州旅游自由行攻略自驾游五天最... 作为一个热爱自由行的驴友,我一直梦想着驾车穿越贵州这片神秘而美丽的土地。这次,我终于下定决心,来了一...
世上没有不透风的墙是什么意思? 世上没有不透风的墙是什么意思?就是说无论什么秘密跟别人说了,都会泄露出去它的意思是:没有永远的秘密。...
夏天就从野餐开始吧特斯拉野营夏... 夏天就从野餐开始吧特斯拉野营夏天五一出游去哪儿玩
游客沉浸式体验草原观光车的&q... 当越野机械与生态草原碰撞出奇妙火花,一场以"绿浪心跳"为主题的沉浸式驾驶体验正在草原旅游区上演。经过...
一厢情愿的意思? 一厢情愿的意思?一厢情愿,对爱情来说,那是单相思加暗恋,对生活来说,那是自以为是加我以为一厢情愿指只...