首页 > 编程语言 >快速排序算法

快速排序算法

时间:2022-11-24 00:11:53浏览次数:65  
标签:arr 基准值 int 算法 数组 排序 快速

快速排序算法

源代码地址:GitHub - firstsaofan/Data-structure-and-algorithm at develop

如果觉得样式不好:跳转即可 (md文件复制过来有些样式会不一样)

原文地址:https://lifengying.site/archives/kuai-su-pai-xu-suan-fa

本来准备一天刷一个算法的,看到这里才发现基本上是一章一个算法,今天我倒是看完了第四章

但是并没有吃透,需要继续编写C#代码实现。

这本书是python作为例子不太适合我,python高度封装的方法显得代码很少,本人没有学过python,这对我来说理解算法会有阻碍,准备去找个网址或者换一本书。

 def quick_sort(data):    
     """快速排序"""    
     if len(data) >= 2:  # 递归入口及出口        
         mid = data[len(data)//2]  # 选取基准值,也可以选取第一个或最后一个元素        
         left, right = [], []  # 定义基准值左右两侧的列表        
         data.remove(mid)  # 从原始数组中移除基准值        
         for num in data:            
             if num >= mid:                
                 right.append(num)            
             else:                
                 left.append(num)        
         return quick_sort(left) + [mid] + quick_sort(right)    
     else:        
         return data
 
 # 示例:
 array = [2,3,5,7,1,4,6,15,5,2,7,9,10,15,9,17,12]
 print(quick_sort(array))
 # 输出为[1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 9, 9, 10, 12, 15, 15, 17]

 

快速排序--->一种常用的优雅的排序算法。快速排序使用分而治之的策略。

分而治之(D&C divide and conquer)

 def sum(list):
  if list == []:
     return 0
 return list[0] + sum(list[1:])
Tips
 s = "abcde"
 ​
 print(s[:1])//a [0,1) 相当于打印第一个字符
 print(s[2:])//cde 索引2--所有

思路:找一个基准值然后根据这个值把这个数组分成左边是小于这个基准值的数组,右边是大于这个基准值的数组,然后分别把这两个数组重复上述,直到子数组只有1个元素

以下是一次执行流程

 

 

 

 //快速排序法 分而治之
 //tips 编写涉及数组的递归函数时,基线条件往往是数组为空或者只包含一个元素。陷入困境时,请检查基线条件是不是这样的。
 ​
 //找到基线条件
 ​
 int[] arr = { 15, 22, 35, 9, 16, 33, 15, 23, 68, 1, 33, 25, 14 }; //待排序数组
 QuickSort(arr, 0, arr.Length - 1);  //调用快速排序函数。传值(要排序数组,基准值位置,数组长度)
 ​
 //控制台遍历输出
 Console.WriteLine("排序后的数列:");
 foreach (int item in arr) {
     Console.WriteLine(item);
 }
 ​
 static void QuickSort(int[] arr, int begin, int end)
 {
     if (begin >= end) {
     return;
    }
     var pivotIndex = GetPivot(arr, begin, end);
 ​
     QuickSort(arr, begin, pivotIndex-1);
     QuickSort(arr, pivotIndex+1, end);
 }
 ​
 static int GetPivot(int[]arr,int begin, int end) {
     //获取基准值索引
     var i = begin;
     var j= end;
     //取第一个元素作为基准值
     var pivot = arr[begin];
     while (i < j)
    {
         //先从右边找比基准值小的值
         while (i < j && arr[j] >= pivot) {
             j--;
        }
         //跳出循环的条件就是找到了基准值小的值
         arr[i]=arr[j];//把右边的小的值甩到前面去
 ​
         //先从左边找比基准值大的值
         while (i < j && arr[i] <= pivot)
        {
             i++;
        }
         //跳出循环的条件就是找到了基准值大的值
         arr[j] = arr[i];//把左边的大的值甩到后面去
    }
     //跳出循环的时候i=j 也就是基准值在的地方
     arr[i] = pivot;
     return i;  
 }
 ​
 Console.WriteLine("Hello, World!");
总结:

根据基准值来划分左右(小大)子数组, 然后一直重复直到子数组元素为1,结束。

i,j可以理解一个定位器或者指针。

 

上节递归小结:

使用战虽然方便,但是也要付出代价,存储详尽的信息可能占用大量的内存。每个函数调用都要占用一定的内存,如果栈很高,就意味着计算机存储了大量的函数调用的信息。在这种情况下,你有两种选择。

1.重新编写代码,转而使用循环。

2.使用尾递归。这是一个高级递归主题,不在本书的讨论范围。另外,并非所有的语言都支持尾递归。

总结

1.递归指的是调用自己的函数

2.每个递归函数都有两个条件:基线条件和递归条件。

3.栈有两种操作:压入和弹出。

4.所有的函数调用都进入调用栈

5.调用栈可能很长,这将占用大量的内存。

 

后面应该会跟着算法导论过一遍算法或者跟着某机构的算法视频过一遍。

上一篇的大O表示法的分数和log的公式表示法 复制过来 博客园貌似没有正常显示,一切内容以原地址为准。

标签:arr,基准值,int,算法,数组,排序,快速
From: https://www.cnblogs.com/firstsaofan/p/16920588.html

相关文章

  • kitex使用系列(一):kitex的安装与快速启动
    kitex介绍kitex是字节跳动内部使用的Golang微服务RPC框架。具有高性能、强可扩展的特点。kitex使用字节跳动自研的Netpoll网络库,比gonet的性能更高,这也是kitex高性能的......
  • 快速迁移系统设计
    目录官方文档重启service将所有需要持久化的数据存储在一个目录其次编写整个的continer启动file网盘数据迁移官方文档https://docs.docker.com/compose/com......
  • 3d激光雷达开发(欧几里得聚类算法)
            图形处理里面有一个聚类算法,叫k-means。基本思想就是默认图像里面有k个区域,每个区域都可以内部聚合、外部松散的组合体,找到了这k个区域,就可以实现图像的分......
  • 代码随想录算法训练营Day08|344. 反转字符串、541. 反转字符串 II、剑指 Offer 05. 替
    代码随想录算法训练营Day08|344.反转字符串、541.反转字符串II、剑指Offer05.替换空格、151.反转字符串中的单词、剑指Offer58-II.左旋转字符串344.反转字符......
  • Luogu7113 & 4017 - 拓扑排序 -
    题目链接:https://www.luogu.com.cn/problem/P7113题解:7113拓扑排序一下,从每个开始点放水,每次*1/size扩展一下即可。要用__int1284017按照拓扑序简单dp一下//byS......
  • 8.排序算法
    排序分类  1.内部排序  只将需要处理的所有数据都加载到内存寄存器中(内存)进行排序。  2.外部排序  数据量过大,无法全部加载到内存中,需要借助外部存储(文件......
  • python 操作Oracle 自关联表进行树结构复制算法
     最近一个项目中,用关系型表来存储树型结构,其中有一段树节点复制的算法,典型的递归运用,可作为递归算法参考练习。defCheckItem_GET_ById(self,dataid):"""......
  • 算法练习:求24点
    小学三年级的儿子在玩四个数字求24的游戏,经常来考我。有些还真不是一下子就能想到。python写了个求解的算法,再也不用费脑了。defs6(lstnum):lst=lstnum[:]......
  • 算法练习1
     求n个整数里,连续m个整数乘积最大的一组。如:[1,2,4,5,3,4]m为2时,1,2  2,44,5 5,3 都是连续的两个数,其中4,5的乘积是最大的。下面是我用,列表推导、reduce、列表排序,实现......
  • 单链表的排序问题
    单链表的排序问题作者:Grey原文地址:博客园:单链表的排序问题CSDN:单链表的排序问题题目链接LeetCode148.SortList思路一:转换数组结合快速排序将链表转换成数组,使用......