so true

          心懷未來,開創未來!
          隨筆 - 160, 文章 - 0, 評論 - 40, 引用 - 0
          數據加載中……

          partition of quick sort

              int partition(vector<int>& nums, int i, int j) {
                  int pivot = i++;
                  while (true) {
                      while (i <= j && nums[i] <= nums[pivot]) ++i; //a
                      while (j >= i && nums[j] >= nums[pivot]) --j; //b
                      if (i > j) {
                          break;
                      }
                      int t = nums[i]; nums[i++] = nums[j]; nums[j--] = t; //c
                  }
                  int t = nums[j]; nums[j] = nums[pivot]; nums[pivot] = t;
                  return j;
              }
          上面這段代碼里,細節太多太多,居然搞了一晚上才搞出來,總的來說大方向上:
          1. 要確保最后能i > j才能終止(其實終止的時候,是一定滿足j + 1 == i的);
          2. 因為保留的是最左側的數為基準,排序目標是從左到右按照從小到大排,因此最后要把pivot和j交換;
          3. //a和//b里,其實只要有一個nums[i]/nums[j]和nums[pivot]的等于判斷就可以了,這里為了一致性,都保留了對等于的判斷;
          4. //c里增加了i和j各自挪一步的操作,因此如下寫法更好:
              int partition(vector<int>& nums, int i, int j) {
                  int pivot = i++;
                  while (true) {
                      while (i <= j && nums[i] <= nums[pivot]) ++i;
                      while (j >= i && nums[j] >= nums[pivot]) --j;
                      if (i > j) {
                          break;
                      }
                      swap(nums[i++], nums[j--]);
                  }
                  swap(nums[pivot], nums[j]);
                  return j;
              }

          posted on 2017-11-26 00:03 so true 閱讀(175) 評論(0)  編輯  收藏 所屬分類: C&C++

          主站蜘蛛池模板: 闽侯县| 衡南县| 梓潼县| 伊通| 西畴县| 伊川县| 开原市| 同德县| 太谷县| 白城市| 丰顺县| 贞丰县| 黄陵县| 阿坝| 盈江县| 封开县| 赞皇县| 舞阳县| 陆河县| 信丰县| 苏尼特左旗| 凯里市| 台前县| 利辛县| 汶川县| 通河县| 恭城| 营口市| 长宁县| 平度市| 湾仔区| 湖州市| 马尔康县| 霸州市| 金塔县| 宁蒗| 嫩江县| 宜黄县| 自贡市| 鹤庆县| 平潭县|