对常见排序算法的总结(选择、插入、希尔、归并、快速、堆排序)

1.选择排序

首先,第一轮循环,取第一个数,与数组中接下来的数进行比较,找到数组中最小的数,与第一个数交换;第二轮循环,取第二个数,与数组中接下来的数进行比较,找到数组中最小的数,与第二个数交换...

大概有N^2/2次比较,N次交换


2.插入排序

对于数组a[],第一轮循环,i=1,j=i,如果a[j]小于a[j-1],两者值交换,j--,继续判断,直到j=0;第二轮循环,i=2,j=i,如果a[j]小于a[j-1],两者值交换,j--...  即a[0]到a[i-1]是有序区,a[i]到a[a.length-1]是无序区,取无序区的一个数在有序区中比较,交换。

通过将a[i]与 a[0]到a[i-1]范围内的所有数比较,找到比a[i]小的数,两者交换,取小的那个数,继续与前面的数比较,直到i=0,此时,小的数就排在前面了。

平均比较和交换大概是N^2/4


3.希尔排序

对于数组a[],取一个小于a.length的数d,将数组分成d个组,组内元素下标相差d,如,数组内有0,1,2,3,4,5,6,7,8,9,取d=5,即分为0,5一组,1,6一组,2,7一组,3,8一组,4,9一组,对各组进行插入排序,然后取d=2,...分组,对各组进行插入排序,直到d=1,此时所有元素都放在同一个组中,即数组本身,此时顺序排完


4.归并排序

自顶向下的归并排序:将数组分成两半,前面一组进行排序,后面一组进行排序,然后在合并成一个大数组,可以发现,这可以形成一种递归,

自底向上的归并排序:第一次循环,每两个元素为一组进行排序,第二次循环,每四个元素为一组进行排序,第三次循环,每八个元素为一组进行排序,直到等于数组长度


5.快速排序

取定一个元素,从左往右找到第一个大于取定元素的元素,从右往左找到第一个小于取定元素的元素,两者交换,可以发现,这能形成一种递归,这样取定元素的左边元素都小于取定元素,取定元素的右边都大于取定元素

可以发现快速排序跟自顶向下的归并排序有点相似,区别:归并排序递归发生在处理整个数组之前,快速排序发生在处理整个数组之后;归并排序将数组分成两个子数组分别排序,然后合并成有序数组,快速排序是两个子数组有序时,整个数组就有序了


6.优先队列

二叉堆(父节点要比两个子节点大)实现,用数组表示,父节点下标 k 与 两个子节点下标 2k,2k+1,k不等于0

上浮:如果该节点的值大于父节点,交换

下沉:如果顶点元素小于两个子节点,与左右节点间大的那个交换

堆排序:首先将原始数组转化为初始堆,对于数组a[],从num = a.length/2开始,判断a[num]是否小于其左右子节点(可以先判断左右子节点哪个比较大,在与父节点比较),如果是,则交换,下标换成与之交换子节点下标,在判断其是否小于左右子节点,如此反复直到没有左右子节点,然后num-1,继续反复,直到num=1,此时初始堆形成。堆顶元素总是最大的

在初始堆中,从i=a.length来说,不断的i--,与堆顶元素,即a[1]元素交换,然后在按上面的方法调整成堆,这样,堆顶元素就会换到后面,如此反复,数组中的数即从小到大排列了




参考算法 第四版


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值