資料結構 快速排序 C Swift 極簡版本

liangtongzhuo發表於2017-12-14
  • 總所周知 快速排序由於排序效率在同為O(N*logN)的幾種排序方法中效率較高,因此經常被採用。

  • 基本原理是 陣列a = [1,3,5,7,6,4,2]
    1 選定一個 基準 a[0] 2 把比 a[0]小的放左邊,比a[0]大的放右邊. 中斷遞迴如果少於兩個數字 則不執行。 3 然後再分別對兩邊 執行 1,2,3操作。

  • 對快速排序 的 想法 1 在待排序元素 大部分是有序的情況下, 速度 非常很快。 2 在最差的情況下,速度就很慢了。 相當於冒泡了 3 所以 快排的 優化, 定基準 非常重要,例如待排序是有序的,基準定在中間,xiao'lv 4 時間複雜度為nlogn,不穩定排序

  • Swift 極簡版本 import UIKit extension Array { var decompose : (head: Element, tail: [Element])? { return (count > 0) ? (self[0], Array(self[1..<count])) : nil } }

          func qsortDemo(input: [Int]) -> [Int] {
              if let (pivot, rest) = input.decompose {
                  let lesser = rest.filter { $0 < pivot }//這裡是小於於pivot基數的分成一個陣列
                  let greater = rest.filter { $0 >= pivot }//這裡是大於等於pivot基數的分成一個陣列
                  return qsortDemo(lesser) + [pivot] + qsortDemo(greater)//遞迴 拼接陣列
              } else {
                  return []
              }
          }
    
          var a:[Int] = [1,2,4,6,2,4,3,7,8]
          qsortDemo(a)
    複製程式碼

///次方法來自http://blog.csdn.net/cg1991130/article/details/48274919

  • swift 版本 import UIKit

                      func quickSort(inout a:[Int],l:Int,r:Int){
                          
                          if l < r {
                              var i = l, j = r ,x = a[i]
                              while i < j && a[j] >= x{
                                  j -= 1
                              }
                              if i < j {
                                  a[i] = a[j]
                                  i += 1
                              }
                              while i < j && a[i] < x {
                                  i += 1
                              }
                              if i < j {
                                  a[j] = a[i]
                                  j -= 1
                              }
                             
                              a[i] = x
                              
                              quickSort(&a, l: l, r: i-1)
                              quickSort(&a, l: i+1, r: r)
                          }
                          
                          
                      }
    
                      var b = [8,7,6,5,4,3,2,1]
    
                       quickSort(&b, l: 0, r: 7)
                          
                          print(b)
    複製程式碼
  • c版本

#include <stdio.h>

            ///三個引數 a要排序的 陣列, l掃左邊的  r掃右邊
            void quickSort(int a[],int l, int r){
                /// 左邊要小於 右邊才有意義
                if (l < r){
                    //儲存 一下  ,基準定為X
                    int i = l, j = r, x = a[i];
                    
                    ///左邊小於右邊才開始迴圈,排序裡面
                    while (i < j) {
                     
                        ///從 右邊開始向左查詢,小於 基準X的值。
                        while (i < j && a[j] >= x)
                            j--;
                        if (i < j)
                            a[i++] = a[j];///調換 他們的值
                        
                        ///該從左邊開始向右查詢 比基準x大與等於值
                        while (i < j && a[i] < x)
                            i++;
                        if (i < j)
                            a[j--] = a[i];
                    
                    }
                    ///然後把 x的值 賦值回去
                    a[i] = x;
                    
                    ///遞迴 左邊
                    quickSort(a, l, i-1);
                    ///右邊
                    quickSort(a, i+1, r);
                    
                }

            }


            int main() {
                
                int a[8] = {8,7,6,5,4,3,2,1};
                
                quickSort(a, 0, 7);
                
                for (int i = 0; i < 8; i++) {
                    printf("%d",a[i]);
                }
                printf("\n");
                return 0;
            }
複製程式碼
  • ######看我那麼可愛n(≧▽≦)n
  • 關注我的微薄 (樑同桌):http://weibo.com/tongrenyinsheng
  • 個人部落格: http://www.liangtongzhuo.com
  • ios 個人寫的app (同人音聲)ASMR音樂

相關文章