快速排序—(面试碰到过好几次)

快速排序—(面试碰到过好几次)原理:  快速排序,说白了就是给基准数据找其正确索引位置的过程.  如下图所示,假设最开始的基准数据为数组第一个元素23,则首先用一个临时变量去存储基准数据,即tmp=23;然后分别从数组的两端扫描数组,设两个指示标志:low指向起始位置,high指向末尾.  首先从后半部分开始,如果扫描到的值大于基准数据就让high减1,如果发现有元素比该基准数据的值小(如上图中18&lt…

大家好,又见面了,我是你们的朋友全栈君。

原理:

   快速排序,说白了就是给基准数据找其正确索引位置的过程.
   如下图所示,假设最开始的基准数据为数组第一个元素23,则首先用一个临时变量去存储基准数据,即tmp=23;然后分别从数组的两端扫描数组,设两个指示标志:low指向起始位置,high指向末尾.
这里写图片描述
   首先从后半部分开始,如果扫描到的值大于基准数据就让high减1,如果发现有元素比该基准数据的值小(如上图中18<=tmp),就将high位置的值赋值给low位置 ,结果如下:
这里写图片描述
然后开始从前往后扫描,如果扫描到的值小于基准数据就让low加1,如果发现有元素大于基准数据的值(如上图46=>tmp),就再将low位置的值赋值给high位置的值,指针移动并且数据交换后的结果如下:
这里写图片描述
然后再开始从后向前扫描,原理同上,发现上图11<=tmp,则将low位置的值赋值给high位置的值 ,结果如下:
然后再开始从后向前扫描,原理同上,发现上图11<=tmp,则将high位置的值赋值给low位置的值,结果如下:
这里写图片描述
然后再开始从前往后遍历,直到low=high结束循环,此时low或high的下标就是基准数据23在该数组中的正确索引位置.如下图所示.
这里写图片描述
  这样一遍走下来,可以很清楚的知道,其实快速排序的本质就是把基准数大的都放在基准数的右边,把比基准数小的放在基准数的左边,这样就找到了该数据在数组中的正确位置.
  以后采用递归的方式分别对前半部分和后半部分排序,当前半部分和后半部分均有序时该数组就自然有序了。

一些小结论

从上面的过程中可以看到:

  ①先从队尾开始向前扫描且当low < high时,如果a[high] > tmp,则high–,但如果a[high] < tmp,则将high的值赋值给low,即arr[low] = a[high],同时要转换数组扫描的方式,即需要从队首开始向队尾进行扫描了
  ②同理,当从队首开始向队尾进行扫描时,如果a[low] < tmp,则low++,但如果a[low] > tmp了,则就需要将low位置的值赋值给high位置,即arr[low] = arr[high],同时将数组扫描方式换为由队尾向队首进行扫描.
  ③不断重复①和②,知道low>=high时(其实是low=high),low或high的位置就是该基准数据在数组中的正确索引位置.

按照上诉理论我写的代码如下:

package com.nrsc.sort;

public class QuickSort { 
   
	public static void main(String[] args) { 
   
		int[] arr = { 
    49, 38, 65, 97, 23, 22, 76, 1, 5, 8, 2, 0, -1, 22 };
		quickSort(arr, 0, arr.length - 1);
		System.out.println("排序后:");
		for (int i : arr) { 
   
			System.out.println(i);
		}
	}

	private static void quickSort(int[] arr, int low, int high) { 
   

		if (low < high) { 
   
			// 找寻基准数据的正确索引
			int index = getIndex(arr, low, high);

			// 进行迭代对index之前和之后的数组进行相同的操作使整个数组变成有序
			//quickSort(arr, 0, index - 1); 之前的版本,这种姿势有很大的性能问题,谢谢大家的建议
			quickSort(arr, low, index - 1);
			quickSort(arr, index + 1, high);
		}

	}

	private static int getIndex(int[] arr, int low, int high) { 
   
		// 基准数据
		int tmp = arr[low];
		while (low < high) { 
   
			// 当队尾的元素大于等于基准数据时,向前挪动high指针
			while (low < high && arr[high] >= tmp) { 
   
				high--;
			}
			// 如果队尾元素小于tmp了,需要将其赋值给low
			arr[low] = arr[high];
			// 当队首元素小于等于tmp时,向前挪动low指针
			while (low < high && arr[low] <= tmp) { 
   
				low++;
			}
			// 当队首元素大于tmp时,需要将其赋值给high
			arr[high] = arr[low];

		}
		// 跳出循环时low和high相等,此时的low或high就是tmp的正确索引位置
		// 由原理部分可以很清楚的知道low位置的值并不是tmp,所以需要将tmp赋值给arr[low]
		arr[low] = tmp;
		return low; // 返回tmp的正确位置
	}
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157542.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 弹性网络回归模型_数据模型剪枝

    弹性网络回归模型_数据模型剪枝本文首发于PandaCV公众号。导语:模型剪枝算法核心在于找到“不重要”的参数并且实现裁剪。为寻找到较优的剪枝策略,我们往往需要尝试多种剪枝策略和剪枝策略性能评估。通常剪枝策略评估方法是将剪枝后的模型训练到收敛或者训练规定好数量epoch后进行性能比较。不管是人工调试剪枝策略还是自动搜索剪枝策略,都需要多次评估剪枝策略。剪枝策略的评估效率一定程度上影响了整体压缩效率。因此,本文提出了一种能够快速衡量剪枝后模型性能的方法,经实验能够对MobilenetV1减少50%的FLOPs情况下,仍能保证在Image

    2022年8月16日
    13
  • string转jsonstring_java json转map

    string转jsonstring_java json转mapJava中Json转string方法Java利用Json-lib包进行json对象转换成stringJSONArray转换string方法实例publicstaticvoidmain(String[]args)throwsJSONException{undefined//创建JSONObject对象JSONObjectjson=newJSONObject();//向json中添加数据json.put(“username”,”wanglihong”);json

    2022年9月8日
    1
  • python 字符串转16进制数字

    1原始文件中的字符串2读取文件字符串从文件中读取2个字节,代码如下:defprint_hex_str(str1):printlen(str1)printstr1printint(str1,16)foriinstr1:print"——–"print(‘%#X’%ord(i))print…

    2022年4月18日
    618
  • 硬核!高频Linux命令大总结,建议收藏~

    硬核!高频Linux命令大总结,建议收藏~前言记得不久前跟大家大分享了一波个人在平时日常工作、学习、开发、写文字、做视频等过程中,一些好用高效的在线工具和网站,并且把自己的浏览器收藏夹书签离线文件都导出给大家了。很多小伙伴后台反馈还不错,说书签一导入后,很多工具确实挺好用,主要省了很多找资源和整理的时间。今天继续分享,最近花了不少时间把平时开发过程中常用的一些Linux系统命令给做了一个大整理,形成一个常用高频Linux速查备忘录。有了它,还怕Linux操作系统常用操作和命令记不住么?接下来直接上菜吧。注:本文GitHubhtt

    2022年5月8日
    34
  • 安卓开发个人小作品(3) – 多功能音乐播放器[通俗易懂]

    安卓开发个人小作品(3) – 多功能音乐播放器[通俗易懂]这次介绍一个多功能音乐播放器,记得是大二那年寒假写的,实现的主要功能就是音乐播放,带进度条控制,扫描本地音乐,上一曲下一曲,播放类型(单曲循环,顺序播放,随机播放),APP主题换肤,背景图更换等,功能都比较基础,基本上如果你不会的话,跟着我的思路,应该都是能实现的,预计会在以后加入歌词的功能。在开始前,先放一张最后的效果图吧,我个人喜欢的风格,简约,美观。目录1.实现扫描本地音乐…

    2022年6月26日
    27
  • selenium报 OSError: [Errno 20] Not a directory

    selenium报 OSError: [Errno 20] Not a directory

    2022年3月13日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号