集训队寒假第五节——排序

一.插入排序

        原理:就如同斗地主一样自己那捡起排放到相应大小位置一样,使一个数组进行排序。

        在a1到an中,先拿a2出来和a1进行比较且有必要时调换位置。然后再拿a3出来与a2、a1进行大小比较且有必要时调换位置。然后再拿a4与a3、a2、a1、进行比较......此类方法就为插入排序。

二.冒泡排序

        原理:需要在数组中的元素两两进行大小比较,例如升序时,假如ai大于ai+1时,则需要交换两者;反之则不交换。

        即:a1与a2比较、a2与a3比较、a3与a4比较......an-1与an比较,这是第一轮。下一轮时着只需要比较到an-2与an-1处即可。因此一共经过n-1轮即可。

三.选择排序

        在一个有n个元素的数组中。首先从a1到an当中选择一个最小是数与a1交换位置,然后从a2到an中选择一个最小的数与a2进行交换,以此类推直到排序完成。

四.快速排序

        原理是在一个数组中,取一个基准值,最好是一个数组的最左边或者最右边。

        假设在升序且最左边的数(al)作为基准值(ap)时,首先从最右边的数(ar)r--直到让找到比ap小的数,然后让l++使al大于ap,最后交换ar与al。重复此步骤直到r=l时使ap与al交换。

        然后让a1到al-1与ar+1到an分成左右半边然后分别重复上一段的步骤很多次递归,直到分到的很多次段变成只有一个元素时即可。最后所得就为一个有序的数组。

五.希尔排序

        第一步:先拿一个数组中的前一半和后一半分别进行比较(a1与an/2+1、a2与an/2+2进行比较)分别比较小的放在前面一半当中,大的则放在后面一半当中。

        第二步:分别拿奇数项自行按大小顺序排序和拿偶数项自行按大小顺序排序。

        第三步:则让全部元素从a1到an-1的元素与其后面的一个元素进行大小比较且有必要进行交换。

六.堆排序

        堆排序需要使用堆删除思路进行排序
        建堆、堆删除中都用到了向下调整,所以了解向下调整,就可以完成堆排序。

例如升序:

        先建一个大堆,不能直接使用堆来实现。可将需要排序的数组看作一个堆,但需要将数组结构变成堆。
        可以从堆从下往上的第二行最右边开始依次向下调整直到调整到堆顶,这样就可以将数组调整成一个堆,且如果建立的是大堆,堆顶元素为最大值。
        然后按照堆删的思想将堆顶和堆底的数据交换,但不同的是这里不删除最后一个元素。
        这样最大元素就在最后一个位置,然后从堆顶向下调整到倒数第二个元素,这样次大的元素就在堆顶,重复上述步骤直到只剩堆顶时停止。

 

七.归并排序

        归并排序分为分散数组和结合数组。

        分散数组:当a1到an中,n为偶数时直接从中间分为左右两部分;若n为基数时则把an单独拿出来,然后把a1到an-1从中间分为左右部分;然后把左右部分分别递归上步步骤直到所有部分都只有一个元素。

        结合数组:可以利用指针的方法从分散数组的步骤中反过来,然后在一个相对属于左右部分的序列中,让两个指针分别指着两边最开始的元素,(升序)从左边开始,假如左边最开始小于右边最开始指针++则只需左边指针找到比右边大,则把左边到该处放到前面然后把上步步骤相反进行重复直到两边数取完。最后整体递归该步骤直到全部数取完结合成为一个有序的数列。

八.计数排序

        原理:找到最大值与最小值,然后利用桶思想把数组中的数装到桶里面,然后进行读桶里面的个数以及桶的数的大小进行排列。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值