快速排序算法java版实现

if(hign <= low) return; // 如果hign 小于等于 low ,说明待排序队列只包含一个元素,无法再排序

int keyIdx = asort(a, low, hign);

if( ! (keyIdx == low && low == hign) ) { // keyIdx == low && low == hign 则说明不可分

if(keyIdx == low ) { //说明左边已经排好序了

quickSort(a, low + 1, hign);

} else if (keyIdx == hign ) { // 说明右边已经排序好了

quickSort(a, low, hign -1);

} else {

quickSort(a, low , keyIdx -1); // 关键字左边排序

quickSort(a, keyIdx + 1, hign); // 关键字右边排序

}

}

}

/**

  • 快速排序 一趟排序算法实现

  • 一趟快速排序的算法是:(来源于百度百科)

  • 1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;

  • 2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];

  • 3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]互换;

  • 4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;

  • 5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,

  • 4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。

  • 找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

  • @param a 待排序数组

  • @param low 待排序起始下标

  • @param hign 待排序结束下标 (low hign) 限制排序数组范围

  • @return 本轮排序后,关键字所在位置(下标)

*/

private static final int asort(int[] a, int low, int hign) {

int key = a[low];

loop :

while (true) { // low 与 hign 相等时退出

while( hign > 0 ) {

if( a[hign] < key ) {

swap(a, low, hign); // 从后向前找,找到第一个比关键字小的元素后交换元素后跳出本次比较

break;

}

hign --;

if(low == hign) break loop;

}

low ++;

if(low == hign) break loop;

while( low < a.length ) {

if( a[low] > key ) { // 从前向后找,找到第一个比关键字大的元素时交换元素后跳出本次比较

swap(a, low, hign);

break;

}

low ++;

if(low == hign) break loop;

}

}

return low;//关键字所在的位置

}

/**

  • 交换数组中两个元素的位置

  • @param a

  • @param i

  • @param j

*/

private static void swap(int[] a, int i, int j) {

int tmp = a[i];

a[i] = a[j];

a[j] = tmp;

}

public static void main(String[] args) {

// TODO Auto-generated method stub

System.out.println(“待排序数据:(5,8,2,10,6,9,21,18,19,7)”);

int[] a = new int[] {5,8,2,10,6,9,21,18,19,7};

quickSort(a, 0, a.length -1);

System.out.println(“排序后结果:”);

for(int i : a) {

System.out.print(i + " ");

}

System.out.println(" ---------------------");

System.out.println(“待排序数据:(5,8,2,10,5,9,21,18,8,7)”);

a = new int[] {5,8,2,10,5,9,21,18,8,7};

quickSort(a, 0, a.length -1);

System.out.println(“排序后结果:”);

for(int i : a) {

System.out.print(i + " ");

}

}

}

算法复杂度分析等相关知识,后续补上。先继续归并排序算法的代码实现先。

欢迎加笔者微信号(dingwpmz),加群探讨,笔者优质专栏目录:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

手绘了下图所示的kafka知识大纲流程图(xmind文件不能上传,导出图片展现),但都可提供源文件给每位爱学习的朋友

image.png

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
“zoom: 33%;” />

最后

手绘了下图所示的kafka知识大纲流程图(xmind文件不能上传,导出图片展现),但都可提供源文件给每位爱学习的朋友

[外链图片转存中…(img-fAQNjxQl-1713684892043)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 22
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值