so true

          心懷未來,開創(chuàng)未來!
          隨筆 - 160, 文章 - 0, 評論 - 40, 引用 - 0
          數(shù)據(jù)加載中……

          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;
              }
          上面這段代碼里,細(xì)節(jié)太多太多,居然搞了一晚上才搞出來,總的來說大方向上:
          1. 要確保最后能i > j才能終止(其實(shí)終止的時(shí)候,是一定滿足j + 1 == i的);
          2. 因?yàn)楸A舻氖亲钭髠?cè)的數(shù)為基準(zhǔn),排序目標(biāo)是從左到右按照從小到大排,因此最后要把pivot和j交換;
          3. //a和//b里,其實(shí)只要有一個(gè)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 閱讀(174) 評論(0)  編輯  收藏 所屬分類: C&C++

          主站蜘蛛池模板: 富锦市| 六安市| 威信县| 山东省| 河西区| 繁昌县| 宝山区| 芦山县| 祥云县| 西贡区| 怀远县| 东阳市| 舟山市| 庐江县| 敦化市| 龙海市| 民县| 陆川县| 南丹县| 桂林市| 德州市| 清流县| 长春市| 遵化市| 南丹县| 扎鲁特旗| 西和县| 南川市| 灌云县| 辰溪县| 吴旗县| 济阳县| 竹山县| 金川县| 温泉县| 屏东市| 广河县| 鄯善县| 涿鹿县| 隆尧县| 呼图壁县|