蓝桥杯---冒泡+快排+哈希排(笔记系列2)

对于此题以下分三种排序算法来解决
冒泡排序:
        先讲一下什么叫冒泡排序法。
        现给一个有10个有效数据的数组a[11](从下标1开始到10),按照上面题目的意思,进行从小到大的顺序进行排序,再倒序输出(当然也可以从大到小顺序输出)。从第一个数开始,对它接下来的每一个数进行比较,如果它的后一个数比前一个数小,则交换,交换到最后则最后一个数必定是当前数组中最大的数。那么第二次进行比较的时候,由于最后一个数字已经确定是最大的,所以比较的次数应该减去1。那么一共有n个数,所以总共的大循环是n-1,也就是一共要对n-1个数字进行冒泡。
         这里的疑惑在于:为什么是n-1的大循环
        这里要注意的是,因为冒泡是两两相比,所以如果是n的循环,则n与n+1这组数无法比较。如果这时数组不大还存在数据溢出情况。
        那么大循环确定以后就是小循环,这个小循环怎么得?回到最开始的两两比较。假设现在处理第一个数,那么进行两两相比的时候,最后确定的数是当前数组最大(或最小)的数,这个数原来不一定是数组的第一个数,也不一定是最后一个数,所以通过两两相比,把大的换到后面,小的放到前面,两个两个一组进行比较,这样就确定了最后一个数,那么小循环第一次就也是n-1。但如果是确定第二个数呢,此时数组的最后一个数已经确定,那么小循环不需要到n-1,只需要到n-2即可,这里发现n减去一个变量,这个变量就是要确定的第几个数。所以,小循环的终止条件是≤n-i。
        讲了这么多总结一下: 冒泡排序就是通过两两相比的方式,来逐步确定一个数组的最大值或最小值,也就是说冒泡排序法只能实现从大到小排序或者从小到大排序。当然也可以实现一半从大到小,一半从小到大,这个是双重的冒泡排序,多了一个分治的过程。这个可以不考虑。
        下面来看详细代码:
        关于时间复杂度与效率的分析:
 
 
 
 
 
快速排序:
     快速排序在C++的API文档中有个sort库函数,这个库函数是一个改良版的快排,也称之为内省式排序。这个库函数的用法如下
        sort(a+1,a+n+1),a是一个数组,这里采用指针的方式,排序a[1]~a[n]的数据。默认是升序
        关于快速排序: https://www.jianshu.com/p/1246ab5f8799
 
哈希排序:
   
这里解释为什么是50,000加上t,因为题目中整数的区间最小是-50,000,且每个数字都各不相同,所以是50,000加上变量t,t的最小值是-50,000。因为数组不存在负的位置,所以只好把负的变成正的,就整体向右移50000,那么就变成了上面所写。
哈希排序:
        把排序的数值放到一个新的数组里面,排序的数值就是新数组的下标。如果排序的数值存在,则对应新数组的值为1,否则为0。
        现在分三种情况处理:①如果排序的数值都是正数,则新数组的大小必须大于数值,同时下标就是排序的数值。②如果排序的数都是负数,则需要加上排序的数值的最小值的绝对值作为固定值。同时下标要减去一个变量i,这个变量i其实就是排序的数值。③如果排序的数值正负数都有,这种情况和第二种情况类似,只不过在输出的时候要根据排序的数值的取值区间来判断这个固定值的取值,其余和第二种情况类似。
哈希排序和桶排序很像,但是又有点不同
最基本的桶排序参考: https://www.cnblogs.com/bqwzx/p/11029264.html
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

澄澈i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值