zoukankan      html  css  js  c++  java
  • 快速排序

    其实研究算法的时候,最好的做法就是拿出纸和笔,然后自己一行一行代码的走下去。

    这样学习的速度我觉得是最快的。

    快排的基本思想是:通过一次排序将整个序列分成两部分,其中一部分的记录均比关

    键值小,另一部均比关键值大。然后在分别对两个小部分进行同样的思想处理。

    代码:

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 void Quicksort(int *iArr, int low, int high);
     6 int Partition(int *iArr, int low, int high);
     7 //int Partition2(int *iArr, int low, int high);
     8 void Swap(int &i, int &j)
     9 {
    10     int iTemp = i;
    11     i = j;
    12     j = iTemp;
    13 }
    14 
    15 void Display(int iArr[], int iLen)
    16 {
    17     std::cout << "iArr = ";
    18     for(int i = 0; i < iLen; i++)
    19     {
    20          std::cout << "	" << iArr[i];
    21     }   
    22     std::cout << std::endl;
    23 }
    24 
    25 int main(int argc, char **argv)
    26 {
    27     int low = 0;
    28     int high = 7;
    29     int iArr[8] = {2, 8, 7, 1, 3, 5, 6, 4};
    30 
    31     Display(iArr, 8);
    32     Quicksort(iArr, low, high);
    33     Display(iArr, 8);
    34     return 0;
    35 }
    36 
    37 void Quicksort(int *iArr, int low, int high)
    38 {
    39     if(low < high)
    40     {
    41         int iPivotLoc = Partition(iArr, low, high);
    42         Quicksort(iArr, low, iPivotLoc - 1);
    43         Quicksort(iArr, iPivotLoc + 1, high);
    44     }
    45 }
    46 
    47 int Partition(int *iArr, int low, int high)
    48 {
    49     while(low < high)
    50     {
    51         int iPivot = iArr[low];
    52 
    53         while(low < high && iArr[high] >= iPivot)
    54         {
    55             high--;
    56         }
    57 
    58         if(low != high)
    59         {
    60             Swap(iArr[low], iArr[high]);
    61         }
    62 
    63         while(low < high && iArr[low] <= iPivot)
    64         {
    65             low++;
    66         }
    67 
    68         if(low != high)
    69         {
    70             Swap(iArr[low], iArr[high]);
    71         }
    72     }
    73 
    74     return low;
    75 }

    整个算法的执行过程如下:(建议按照这个数据,然后用纸和笔手动的走一遍代码。)

    iArr = 2 8 7 1 3 5 6 4
    low = 0 high = 7 iPivot = 2
    low = 0 high = 6 iPivot = 2
    low = 0 high = 5 iPivot = 2
    low = 0 high = 4 iPivot = 2
    low = 0 high = 3 iPivot = 2
    low = 0 high = 3 iPivot = 2 // 53行为false了
    iArr = 1 8 7 2 3 5 6 4
    low = 1 high = 3 iPivot = 2
    low = 1 high = 3 iPivot = 2 // 63行为false了
    iArr = 1 2 7 8 3 5 6 4
    low = 1 high = 3 iPivot = 2
    low = 1 high = 2 iPivot = 2
    low = 1 high = 1 iPivot = 2
    low = 1 high = 1 iPivot = 2 // 53行为false了
    iArr = 1 2 7 8 3 5 6 4
    low = 1 high = 1 iPivot = 2 // 63行为false了
    iArr = 1 2 7 8 3 5 6 4
    ***************************************************** // 整个Partition函数执行完了

    iArr = 1 2 7 8 3 5 6 4
    low = 2 high = 7 iPivot = 7
    low = 2 high = 7 iPivot = 7
    iArr = 1 2 4 8 3 5 6 7
    low = 3 high = 7 iPivot = 7
    low = 3 high = 7 iPivot = 7
    iArr = 1 2 4 7 3 5 6 8
    low = 3 high = 7 iPivot = 7
    low = 3 high = 6 iPivot = 7
    low = 3 high = 6 iPivot = 7
    iArr = 1 2 4 6 3 5 7 8
    low = 4 high = 6 iPivot = 7
    low = 5 high = 6 iPivot = 7
    low = 6 high = 6 iPivot = 7
    low = 6 high = 6 iPivot = 7
    iArr = 1 2 4 6 3 5 7 8
    *****************************************************

    iArr = 1 2 4 6 3 5 7 8
    low = 2 high = 5 iPivot = 4
    low = 2 high = 4 iPivot = 4
    low = 2 high = 4 iPivot = 4
    iArr = 1 2 3 6 4 5 7 8
    low = 3 high = 4 iPivot = 4
    low = 3 high = 4 iPivot = 4
    iArr = 1 2 3 4 6 5 7 8
    low = 3 high = 4 iPivot = 4
    low = 3 high = 3 iPivot = 4
    low = 3 high = 3 iPivot = 4
    iArr = 1 2 3 4 6 5 7 8
    low = 3 high = 3 iPivot = 4
    iArr = 1 2 3 4 6 5 7 8
    *****************************************************

    iArr = 1 2 3 4 6 5 7 8
    low = 4 high = 5 iPivot = 6
    low = 4 high = 5 iPivot = 6
    iArr = 1 2 3 4 5 6 7 8
    low = 5 high = 5 iPivot = 6
    low = 5 high = 5 iPivot = 6
    iArr = 1 2 3 4 5 6 7 8
    *****************************************************

    最终结果:
    iArr = 1 2 3 4 5 6 7 8

    好像还以一种更高效一点的写法,后续更新。

  • 相关阅读:
    LeetCode数学系列(1)——第172解题思路
    python的匿名函数lambda解释及用法
    LeetCode位操作系列(2)——位运算的常用技巧:lowbit运算,包含lowbit公式、讲解、231题运用
    【零散】jupyter notebook快捷键 mac版
    【油猴插件】分享推荐
    【Mac】 Chromedriver 存放路径
    【全网首发】微信公众号常见垃圾文章广告软文关键词整理
    Mac Chrome浏览器取消自动升级(最新版)
    requests与selenium之前cookies传递
    [转]scrapy中的request.meta
  • 原文地址:https://www.cnblogs.com/AndyStudy/p/6619181.html
Copyright © 2011-2022 走看看