Ytl's Java Blog

          厚積而薄發---每一天都是一個全新的開始
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Alogrithms to quicksort

          Posted on 2011-05-08 14:13 ytl 閱讀(347) 評論(0)  編輯  收藏

          Quicksort

          Quicksort is a fast sorting algorithm, which is used not only for educational purposes, but widely applied in practice. On the average, it has O(n log n) complexity, making quicksort suitable for sorting big data volumes. The idea of the algorithm is quite simple and once you realize it, you can write quicksort as fast as bubble sort.

          Algorithm

          The divide-and-conquer strategy is used in quicksort. Below the recursion step is described:
          1. Choose a pivot value. We take the value of the middle element as pivot value, but it can be any value, which is in range of sorted values, even if it doesn't present in the array.
          2. Partition. Rearrange elements in such a way, that all elements which are lesser than the pivot go to the left part of the array and all elements greater than the pivot, go to the right part of the array. Values equal to the pivot can stay in any part of the array. Notice, that array may be divided in non-equal parts.
          3. Sort both parts. Apply quicksort algorithm recursively to the left and the right parts.

          Partition algorithm in detail

          There are two indices i and j and at the very beginning of the partition algorithm i points to the first element in the array andj points to the last one. Then algorithm moves i forward, until an element with value greater or equal to the pivot is found. Index j is moved backward, until an element with value lesser or equal to the pivot is found. If i ≤ j then they are swapped and i steps to the next position (i + 1), j steps to the previous one (j - 1). Algorithm stops, when i becomes greater than j.

          After partition, all values before i-th element are less or equal than the pivot and all values after j-th element are greater or equal to the pivot.

          Example. Sort {1, 12, 5, 26, 7, 14, 3, 7, 2} using quicksort.

          Quicksort example

          Notice, that we show here only the first recursion step, in order not to make example too long. But, in fact, {1, 2, 5, 7, 3} and {14, 7, 26, 12} are sorted then recursively.

          Why does it work?

          On the partition step algorithm divides the array into two parts and every element a from the left part is less or equal than every element b from the right part. Also a and b satisfy a ≤ pivot ≤ b inequality. After completion of the recursion calls both of the parts become sorted and, taking into account arguments stated above, the whole array is sorted.

          Complexity analysis

          On the average quicksort has O(n log n) complexity, but strong proof of this fact is not trivial and not presented here. Still, you can find the proof in [1]. In worst case, quicksort runs O(n2) time, but on the most "practical" data it works just fine and outperforms other O(n log n) sorting algorithms.

          Code snippets

          Java

          int partition(int arr[], int left, int right)

          {

               int i = left;

               int j = right;

               int temp;

              int  pivot = arr[(left+right)>>1];

               while(i<=j){

                  while(arr[i]>=pivot){

                      i++;

                  }

                  while(arr[j]<=pivot){

                      j--;

                 }

                 if(i<=j){

                     temp = arr[i];

                     arr[i] = arr[j];

                     arr[j] = temp;

                     i++;

                     j--;

                 }

              }

              return i

          }

           

          void quickSort(int arr[], int left, int right) {

                int index = partition(arr, left, right);

                if(left<index-1){

                   quickSort(arr,left,index-1);

                }

                if(index<right){

                   quickSort(arr,index,right); 

                }

          }

          python

          def quickSort(L,left,right) {

                i = left

                j = right

                if right-left <=1:

                      return L

                pivot = L[(left + right) >>1];

                /* partition */

                while (i <= j) {

                      while (L[i] < pivot)

                            i++;

                      while (L[j] > pivot)

                            j--;

                      if (i <= j) {

                            L[i],L[j] = L[j],L[i]

                            i++;

                            j--;

                      }

                };

                /* recursion */

                if (left < j)

                      quickSort(Lleftj);

                if (i < right)

                      quickSort(Liright);

          }

          主站蜘蛛池模板: 鲁甸县| 兴文县| 永修县| 抚宁县| 泽普县| 龙海市| 蕲春县| 论坛| 定陶县| 阿巴嘎旗| 怀来县| 千阳县| 镇坪县| 察隅县| 雷山县| 铜川市| 辽源市| 五指山市| 公主岭市| 辽阳市| 阿巴嘎旗| 武川县| 偃师市| 河曲县| 胶南市| 常州市| 荃湾区| 巴楚县| 淮阳县| 利津县| 宁波市| 宜黄县| 台安县| 敦化市| 临颍县| 麟游县| 安多县| 祁连县| 阜城县| 理塘县| 子长县|