数据结构 快速排序 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;
            }
复制代码
  • ######看我那么可爱n(≧▽≦)n
  • 关注我的微薄 (梁同桌):http://weibo.com/tongrenyinsheng
  • 个人博客: http://www.liangtongzhuo.com
  • ios 个人写的app (同人音声)ASMR音乐

转载于:https://juejin.im/post/5a31f18d51882526151a9c33

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值