C#实现快速排序

思路:

通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可以分别对着两部分记录继续进行排序,以达到整个序列有序。

图解:

实现:

实现过程通过挖坑法和递归实现

根据定义,此排序就是不断的将一组需要排序的数进行分割,而分割后的部分,我们要通过递归来做,所以除了数组的参数外,我们还要传入两个参数,一个是开始索引,一个是结束索引,而写递归,首先写好递归的停止条件,条件就是开始索引大于或等于停止索引时,跳出递归(一旦满足此条件说明要进行排序的数不存在或仅有一个数,没必要进行排序)

然后我们创建一个局部变量,将传入的的开始索引与结束索引保存(后续开始递归时会用到,而在执行过程中,会修改他们的值,所以要保存),然后挖坑法,我们首先要有一个坑,而这个坑,我们选择开始索引的那个值,然后继续写一个循环,结束条件为开始索引比结束索引大或相等(因为我们在循环中会不断更改开始索引与结束索引,所以此条件满足则说明已经找完了数组中的所有数),而找完所有数后,就意味着目前已经找到了一个相对中间的位置了(左边都比key小,右边都比key大),我们将key值放到这个位置上,然后递归,递归的范围就是从最左侧的索引到key-1的位置,从key+1的位置到最右侧的索引

好,整体上说完了,现在说循环内的换坑位,首先我们从右向左找,如果这个数比我们的key要大就继续找,直到找到一个比key小的数,把他放到坑位里(到坑位后,这个位置的数就相当于是多出来的了),然后再从左向右找,如果这个数比我们的key值要小,就继续找,直到找到一个比key大的,将他放在刚刚那个已经放入坑位的数的位置上即可

这就是快速排序的整体思想

应用:

因为快速排序应用的本就是分治法的思想,所以在这里我就直接简单介绍一下分治法吧

分治法定义:

将一个大的问题分解成若干个小的问题,并且这些小问题与大问题的问题性质保持一致,通过处理小问题从而处理大问题。这里用到了递归的思想。

分治法主要思想:

1.分:将整个问题分成多个子问题。

2.求解:求解各个子问题。

3.合并:合并所有子问题的解,从而得到原始问题的解。

分治法案例:

最大子数组问题,需求是在一组股票的每天价格中,求出在哪一天买入,哪一天卖出,赚的最多

分治法案例图解:

分治法案例实现:

计算差价及调用(不涉及分治法)

写了一个结构体方便返回数据(不涉及分治法)

第一部分:

第二部分:

第三部分:

第四部分:

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值