排序(知道了原理,也不会写代码)
Posted bensonchang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序(知道了原理,也不会写代码)相关的知识,希望对你有一定的参考价值。
一:冒泡排序:
1、遍历列表的每一个元素,将前一个元素i和下一个元素i+1(相邻)对比,如果i>i+1,则交换位置,否则不变,再将i+1和i+2对比,如果i+1>i+2,则交换,否则不变,不变则进行下一个相邻的元素比较,直至比较到最后一个(n)元素
2、从头再来重复1的步骤,直至比较到最后位置n-1元素
3、重复1的步骤,直至到位置n-2的元素
4、.........
5、n-(n-1)时则停止
二:选择排序:
1、遍历整个列表,将第一个元素设置为最小元素(假设),且被认为时没有进行排序的,依次和后面的元素进行对比,i和i+1比较,i和i+2比较,i和i+3比较,....,i和n(最后一个)比较
如果中途遇到小于第一个元素的,例如i+3<i, 则将i+3设置为最小的元素,向后依次比较,如遇到比i+3小的元素,再将其设置为最小的元素,直至遍历完整个列表,将最后设置为最小的元素和第一个元素(起始最小值)进行交换,此时最后设置的最小元素放在第一个,且被认为时排过序的,位置不再变,也就不再进行和其他元素比较
2、将第二个元素设置为最小的元素(假设),重复1的步骤,最后设置为最小的那个元素则放在了第二个位置
依次重复以上步骤
三:插入排序:
将第一个元素规定为已经排序过的元素,后面的元素标记为没有排过序的,将第一个没有排过序的元素(i+1)提取出来(原位置就为空),和已经排序的元素(i)进行比较,如果i>i+1,则 i 向右移动,i+1填补 i 的位置,标记为排过序,如果不大于,将提取的元素i+1再放回原位置,标记为已经排过序,再提取i+2元素,和已经排过序的i+1进行比较,如果i+1>i+2,则i+1向右移动,i+2再和已经排过序的 i 进行比较,如果 i > i+2, i 向右移动,i+2 填补 i 的位置,如果 i < i+2,则 i+2填补i+1的位置, 如果 i+1<i+2,则i+2放回原位置,
后面依次类推
四:快速排序:
设置两个指针 i 和 j 分别指向第一个元素和最后一个元素,将第一个元素设置为基数,
1、让指针 j 从后往前依次指向每一个元素,指向的每一个元素依次和基数相比,直到找到小于基数的元素,j 指向它停止,同时交换两个元素的位置,交换过后, j 此时指向的就是基数,
2、再将 i 从前往后依次指向每一个元素,指向的每一个元素依次和基数相比,直到找到大于基数的元素,i 指向它停止,同时交换两个元素的位置,交换过后,i 此时指向的就是基数,
j 此时指向的元素就是交换之前 i 指向的那个元素
重复 1、 2、 步骤(谁指向基数谁就不动)
五:基数排序:
先设置编号顺序为0,1,2,3,4,5,6,7,8,9十个桶
1、让每一个元素依次对10进行取余,根据余数将放在对应编号的桶里,从对应编号的桶里,再按照先进后出的原则取出来,例如:0号桶取出的第一个放在最前面,第二个其次,其次是1号桶,后面依次 (个位)
再将每一个元素的对100进行取余,根据余数放在对应编号的桶里,按照 1 的步骤操作(十位)
再进行对1000取余,放桶,按照1 操作(千位)
.......
直到位数最多的元素取余完,排序完成
以上是关于排序(知道了原理,也不会写代码)的主要内容,如果未能解决你的问题,请参考以下文章
对List<Map<string,string>>排序,要求可以按照正序、逆序排序(代码写不出来可以写原理)