码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序

时间:2021-02-18 13:11:13      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:--   pack   接下来   image   结束   system   style   处理   i++   

快速排序是用的比较多的排序算法,比如需要对“6 1 2 7 9 3 4 5 10 8”这几个数进行排序。方法是首先在这个序列中随便找一个数作为基准数。比如找 6 作为基准数,
然后需要将这个序列中所有比基准数 6 大的数放右边,比基准数小的数放 6 的左边,类似如下排列:
技术图片
初始的状态下数字 6 在序列的第 1 位,目标是将 6 挪到中间某个位置,假如这个位置为 K,就需要寻找这个 k,然后以 k 为分界点,左边的数都小于 6,右边的数都大于等于 6。方法是从初始序列“6 1 2 7 9 3 4 5 10 8”的两端进行探测,先从右边往左找一个小于 6 的数,再从左往右找一个大于 6 的数,然后交换他们,可以用两个变量 i 和 j,分别指向最左边和最右边,刚开始让 i 指向序列最左边即(i=1),指向数字 6。让 j 指向序列最右边(j=10),指向数字 8。
技术图片
首先 j 开始出动,因为此处设置的基准数是最左边的数,所以需要 j 开始出动,一步步向左挪动,即 j--,直到找到一个小于 6 的数停下来。然后 i 开始向右挪动,即 i++,直到找到一个大于 6 的数停下来。
技术图片
 
进行交换后顺序如下:
 
技术图片
第一次交换结束,接下来 j 继续向左挪动,找到 4 比基准数小需要停下来
 
技术图片

技术图片

此时基准数 6 已经归位,正好处在序列的第 6 位。已经将原来的序列以 6 为分界点拆分成了两个序列,左边的序列是“3 1 2 5 4”,右边的序列是“9 7 10 8”。
接下来就需要分别处理这两个序列,按照刚刚的方法分别处理 6 左边和右边的序列即可。
左边的序列是“3 1 2 5 4”,将 3 作为基准数进行调整,使得 3 左边的都是小于等于3,3 右边的都是大于等于 3。
技术图片

 技术图片

 1 package day08;
 2 
 3  
 4 
 5 public class QuickSort {
 6 
 7     public static void quickSort(int[] arr, int left, int right) {
 8 
 9         int i, j, temp, t;
10 
11         if (left > right) {
12 
13             return;
14 
15         }
16 
17         i = left;
18 
19         j = right;
20 
21         //temp是基准位
22 
23         temp = arr[left];
24 
25         while (i < j) {
26 
27             //j从右往左依次挪动进行递减
28 
29             while (temp <= arr[j] && i < j) {
30 
31                 j--;
32 
33             }
34 
35             //i从左往右依次挪动进行递增
36 
37             while (temp >= arr[i] && i < j) {
38 
39                 i++;
40 
41             }
42 
43             //如果满足条件进行交换
44 
45             if (i < j) {
46 
47                 t = arr[j];
48 
49                 arr[j] = arr[i];
50 
51                 arr[i] = t;
52 
53             }
54 
55  
56 
57         }
58 
59         //最后将基准位与i和j相等位置的数字交换
60 
61         arr[left] = arr[i];
62 
63         arr[i] = temp;
64 
65         quickSort(arr, left, j - 1);
66 
67         quickSort(arr, j + 1, right);
68 
69     }
70 
71  
72 
73     public static void main(String[] args) {
74 
75         int[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
76 
77         quickSort(arr, 0, arr.length - 1);
78 
79         for (int i = 0; i < arr.length; i++) {
80 
81             System.out.print(arr[i] + "\t");
82 
83         }
84 
85     }
86 
87 }

运行结果:

 技术图片

快速排序

标签:--   pack   接下来   image   结束   system   style   处理   i++   

原文地址:https://www.cnblogs.com/xxeleanor/p/14405832.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!