数据结构 快速排序 C Swift 极简版本

  • 总所周知 快速排序由于排序效率在同为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;
            }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容