快速排序

最近学校在讲数据结构,个人觉得排序这一块的算法都挺重要的,不管怎么说,比较常见的几个排序算法一定要能够在短时间内写出来,这就是所谓基本功。---来自于班导师

哈哈哈,废话不多说,这里先记录一下快速排序的笔记,免得以后自己忘了。

快速排序的主要思想就是选取数组里面的一个数(这里主要是作数组元素的排序,这个数一般我们选第一个,所以极端情况下快排的时间复杂度其实也达到了O(n²)),把它赋给pivot。然后遍历这个数组,比这个数大的就放在数组的右边,比它小的就放在左边,然后这个过程再递归完成。下面来看看代码:

 1 package com.hw.sorts0512;
 2 
 3 import java.util.Scanner;
 4 
 5 class Quicksort{
 6     public int length;
 7     private int pivot,index;
 8     public int[] data = null;
 9     
10     private int partition(int[] arr,int low,int high)
11     {
12         pivot = arr[low];
13         while(low < high)
14         {
15             while(low<high && pivot<=arr[high])
16             {
17                 high--;
18             }
19             arr[low] = arr[high];
20             
21             while(low<high && pivot>=arr[low])
22             {
23                 low++;
24             }
25             arr[high] = arr[low];
26         }
27         arr[low] = pivot;
28         return low;
29     }
30     
31     public void quicksort(int[] arr,int low,int high)
32     {
33         if(low < high){
34             index = partition(arr,low,high);
35             quicksort(arr,low,index-1);
36             quicksort(arr,index+1,high);
37         }
38     }
39 }
40 
41 public class Solution {
42     public void run()
43     {
44         Scanner s = new Scanner(System.in);
45         Quicksort q = new Quicksort();
46         System.out.println("请输入数组长度:");
47         q.length = s.nextInt();
48         q.data = new int[q.length];
49         System.out.println("请输入待排序的所有数据:");
50         for(int i = 0;i < q.length;i++){
51             q.data[i] = s.nextInt();
52         }
53         q.quicksort(q.data, 0, q.length-1);
54         for(int i = 0;i < q.length;i++){
55             System.out.print(q.data[i]+" ");
56         }
57     }
58     
59     public static void main(String[] args){
60         Solution solution = new Solution();
61         solution.run();
62     }
63 }

核心部分就是Quicksort里面的那两个方法。我怎么才能做到把这个数组全部扫一遍,并判断那些数比pivot大哪些数比pivot小呢?这个时候我们就需要弄一个循环,通过循环控制这个过程不断地进行,以达到第一轮筛选的目的,即,把数组里面比pivot大的数全部放到右边,小的全放到左边,然后左右两边再重复这个过程。

那么这个循环设置的条件其实就是low<high,low就是数组的第一个元素,high就是数组的最后一个元素。在循环内部,只要是比pivot大的数,我就不动,放那放着就是,我动什么呢?动high这个值,也就是数组元素的索引。怎么动?我让它减减。然后继续判断下一个数。等到循环结束的时候,那么就找到了这个比pivot小的数了,这个时候呢,我把这个地方的这个元素赋给low这个位置。那么这样其实就完成了,把这个比pivot小的数放到了数组的左边。然后我再动low,过程与上面类似。这样一来,一旦循环结束,就是low=high.这个时候呢,我就已经把这个数组分成两部分了,左边部分的数都比pivot小,右边部分的数都比pivot大。这个时候呢,我就只需要把此时数组中low这个位置弄为pivot,整个过程就完成了,最后返回这个位置,以这个位置把数组分为两部分,两部分再分别递归。

来看看运行效果:

 接下来看看C++版本的:

 1 #include <iostream>
 2 #define N 300
 3 using namespace std;
 4 
 5 class Quicksort
 6 {
 7 public:
 8     int data[N];
 9     int length;
10     void quicksort(int arr[], int low, int high)
11     {
12         if (low < high) {
13             index = partition(arr, low, high);
14             quicksort(arr, index + 1, high);
15             quicksort(arr, low, index - 1);
16         }
17     }
18 
19 private:
20     int index, pivot;
21     int partition(int arr[], int low, int high)
22     {
23         pivot = arr[low];
24         while (low < high)
25         {
26             while (low < high && pivot <= arr[high])
27             {
28                 high--;
29             }
30             arr[low] = arr[high];
31             while (low < high && pivot >= arr[low])
32             {
33                 low++;
34             }
35             arr[high] = arr[low];
36         }
37         arr[low] = pivot;
38         return low;
39     }
40 };
41 
42 int main()
43 {
44     Quicksort q;
45     cout << "请输入数组长度:";
46     cin >> q.length;
47     cout << "请向数组中输入数据:";
48     for (int i = 0; i < q.length; i++) {
49         cin >> q.data[i];
50     }
51     q.quicksort(q.data, 0, q.length - 1);
52     cout << "使用快速排序后的数组是:";
53     for (int i = 0; i < q.length; i++) {
54         cout << q.data[i] << " ";
55     }
56     cout << endl;
57     return 0;
58 }

 

posted @ 2021-05-12 20:10  EvanTheBoy  阅读(47)  评论(0编辑  收藏  举报