栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

快速排序(Quick Sort)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

快速排序(Quick Sort)

文章目录
      • 算法描述
      • 动图演示
      • 代码实现
      • 算法分析

快速排序的基本思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序。

算法描述

快速排序使用分治法来把一个串(list)分成两个子串(sub-lists)。具体算法描述如下:

  • 从数列中挑出一个元素,称为“基准”(pivot);
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆放到基准值的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
动图演示


注意:此动图演示的 数据移动的顺序 和下列代码是一致的,标黄意味着设为temp值,当前位置待放入相应数据;
特别注意:这里标黄的位置是占指针索引的,相当于空出位置给待放入的数据,temp数据会在分区结束时放到最后一个数据移动的前的位置,相当于此次分区返回的mid的位置。
此图演示的 数据检索的顺序 和下列代码是不一致的,
标紫意味着满足while循环的条件,此时指针移动
标绿意味着不满足while循环的条件,此时数据移动
建议:在草纸上写一个数组,按演示代码的逻辑自己走一遍,彻底理解算法的逻辑

代码实现
public static void main(String[] args){
  int[] array = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
  //只需要修改成对应的方法名就可以了
  quickSort(array);
  System.out.println(Arrays.toString(array));
}
 public static void quickSort(int[] array){
 	quickSort(array,0,array.length - 1);
 }
 private static void quickSort(int[] array,int left,int right){
 	if(array == null || left >= reght || array.length <= 1){
 		return;
 	}
 	int mid = partition(array,left,right);
 	quickSort(array,left,mid);
 	quickSort(array,mid + 1,right);
 }
 private static int partition(int[] array,int left,int right){
 	int temp = array[left];
 	while(right > left){
 		//先判断基准数和后面的数依次比较
 		while(temp <= array[right] && left < right){
 			--right;
 		}
 		//当基准数大于了array[left],则填坑
 		if(left < right){
 			array[left] = array[right];
 			++left;
 		}
 		//现在是array[right]需要填坑了
 		while( temp >= array[left] && left < right){
 			++left;
 		}
 		if(left < right){
 			array[right] = array[left];
 			--right;
 		}
 	}
 	array[left] = temp;
 	return left;
 }
算法分析
算法平均时间复杂度最好情况最坏情况空间复杂度排序方式稳定性
快速排序O(nlog n)O(nlog n)O(n2)O(log n)in -place不稳定
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/666535.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号