博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【东东学数据结构】快速排序
阅读量:6345 次
发布时间:2019-06-22

本文共 3353 字,大约阅读时间需要 11 分钟。

hot3.png

快速排序是由所发展的一种。在平均状况下,排序 n 个项目要(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实作出来,且在大部分真实世界的资料,可以决定设计的选择,减少所需时间的二次方项之可能性。

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。然后分别递归的排序关键数据前面和后面两段数据。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

在具体实现上,如何吧将所有比它小的数都放到它前面,所有比它大的数都放到它后面是关键。也有不同的版本。先来第一个版本:

1 import java.util.Arrays;  2 import java.util.Random;  3  4 /**  5  * User: laichendong  6  * Date: 12-3-14  7  * Time: 上午9:57  8  */  9 public class QuickSort {
10 private static Random random = new Random(); 11 12 public static void main(String[] args) {
13 int[] array = {49, 38, 52, 44, 81, 97, 76, 13, 27, 65}; 14 qsort(array, 0, array.length - 1); 15 System.out.println(Arrays.toString(array)); 16 } 17 18 private static int partionSort(int[] array, int begin, int end) {
19 int index = begin + random.nextInt(end - begin + 1); 20 int key = array[index]; 21 swap(array, index, end); 22 for (int k = index = begin; k < end; k++) {
23 if (array[k] < key) {
24 swap(array, index, k); 25 index++; 26 } 27 } 28 swap(array, index, end); 29 return index; 30 } 31 32 private static void qsort(int[] array, int begin, int end) {
33 if (begin < end) {
34 int index = partionSort(array, begin, end); 35 qsort(array, begin, index - 1); 36 qsort(array, index, end); 37 } 38 } 39 40 private static void swap(int[] a, int i, int j) {
41 int t = a[i]; 42 a[i] = a[j]; 43 a[j] = t; 44 } 45 }

第二个版本:

1 import java.util.Arrays;  2 import java.util.Random;  3  4 /**  5  * User: laichendong  6  * Date: 12-3-14  7  * Time: 上午9:57  8  */  9 public class QuickSort {
10 private static Random random = new Random(); 11 12 public static void main(String[] args) {
13 int[] array2 = {49, 38, 52, 44, 81, 97, 76, 13, 27, 65}; 14 qsort2(array2, 0, array2.length - 1); 15 System.out.println(Arrays.toString(array2)); 16 } 17 18 private static void qsort2(int[] array, int begin, int end) {
19 if (begin < end) {
20 int index = partionSort2(array, begin, end); 21 if(begin < end - 1){
22 qsort(array, begin, index - 1); 23 qsort(array, index, end); 24 } 25 } 26 } 27 28 private static int partionSort2(int[] array, int begin, int end){
29 int key = array[begin]; 30 int i = begin; 31 int j = end; 32 while (i <= j){
33 if(array[j] <= key){
34 if(array[i] >= key){
35 swap(array, i, j); 36 j--; 37 }else {
38 i++; 39 } 40 }else{
41 j--; 42 } 43 } 44 return i; 45 } 46 47 private static void swap(int[] a, int i, int j) {
48 int t = a[i]; 49 a[i] = a[j]; 50 a[j] = t; 51 } 52 }

推荐使用第一个版本,比较好理解。最后,发一个对应版本二的动画演示:

转载于:https://my.oschina.net/laichendong/blog/283869

你可能感兴趣的文章
Asp.Net MVC EF各版本区别
查看>>
Linux查看文件以及文件夹的大小
查看>>
Android App 开发技能图谱
查看>>
Remote Desktop Connection没法全屏解决方案
查看>>
扩张js的String——trim
查看>>
AE数据加载
查看>>
状态模式
查看>>
for update造成的Oracle锁表与解锁
查看>>
真有用?Snap和Flatpak 通吃所有发行版的打包方式。
查看>>
Multiload-ng
查看>>
Atitit mac os 版本 新特性 attilax大总结
查看>>
中国金融出版社出版的2016版《公司信贷》
查看>>
只需一点小修改,HTC Vive画面会更清晰锐利
查看>>
页面接口防刷 解决思路一nginx
查看>>
【Unity 3D 游戏开发】Unity3D 入门 - 工作区域介绍 与 入门演示样例
查看>>
正则表达式速查表
查看>>
Android基础新手教程——1.10 反编译APK获代替码&amp;资源
查看>>
放低自己,你其实没有自己想象的那么重要
查看>>
[WASM + Rust] Debug a WebAssembly Module Written in Rust using console.log
查看>>
.net core 使用Redis的发布订阅
查看>>