一、直接插入排序
思想:
将数组中的所有元素依次与前面已经排好的元素从后向前进行比较,如果当前元素比已排序的元素小,就交换,直到所有元素都比较过
案例:
代码分析:
两层循环
第一层:遍历待比较的所有数组元素
第二层:将本轮的当前元素与已经排好的元素相比较,当前元素>已排好的,两者交换
代码实现:
二、希尔排序
思想:
1.将待排序数组按步长gap进行分组(数组长度为n,第一次gap为n/2),将每组元素利用直接插入的方法排序;
2.每次gap折半,循环上述操作;
3.当gap等于1时,利用直接插入,完成排序。
案例:
代码分析:
三层循环
第一层:将gap依次折半,对序列进行分支,直到gap=1
第二、三层:直接插入排序所需要的两次循环
代码实现:
三、直接选择排序
思想:
比较+交换
1.从待排序序列中,找到关键字最小的元素;
2.如果最小元素不是待排序序列的第一个元素,则将其和第一个元素交换;
3.从余下的n-1个元素中找出关键字最小的元素,重复第2步,直到排序结束。
案例:
代码分析:
两层循环
第一层:依次遍历序列当中的每一个元素
第二层:将遍历得到的当前元素与余下的元素进行比较,如果符合最小元素的条件,就交换。
代码实现:
四、堆排序
堆概念:本质是一种数组对象。任一父节点大于(或小于)其左右孩子,分为大顶堆和小顶堆。
思想:
1.将序列写成完美二叉树的形式,再将其构建成大顶堆;(此时位于根节点的元素就是当前序列的最大值)
2.取出当前大顶堆的根节点,将其与序列末尾元素进行交换;(此时序列末尾元素为最大值)
3.对交换后的n-1个序列元素进行调整,使其满足大顶堆的性值;
4.重复2、3步,直至堆中只有一个元素为止。
案例:
代码分析:
代码实现:
五、冒泡排序
思想:
1.将序列当中的左右元素依次比较,让右边的元素始终大于左边的元素(第一轮结束,序列的最后一个元素为当前序列的最大值);
2.对序列剩下的n-1个元素再次执行步骤1;
3.长度为n的序列,一共需执行n-1轮比较
案例:
代码实现:
六、快排
思想:
挖坑填数+分治
1.选择序列中的第一个数为基准数;
2.将序列中的所有元素遍历,比基准数小的位于其左侧,大的位于其右侧;
3.重复前两步,至所有子集中只有一个元素为止。
代码分析:(伪代码描述如下)
1.i = Low; j = High;基准数挖出形成第一个坑 a[ i ]。
2.j - - 由后向前找比它小的数,找出后 j 停止移动,挖出此数填到前一个坑a [ i ]中。
3.i + + 由前向后找比它大的数,找到后也挖出此数填到前一个坑 a [ j ]中。
4.重复执行2、3步,直到 i = = j,将基准数填到a [ i ]中。
案例:
代码实现:
七、归并排序
思想:
1.分解,将一个无序的序列采用递归一直一分为二,直到分组后组内只有一个元素,此时组内所有元素有序,分组结束;
2.合并,将划分后的序列段两两排序合并。
案例:
八、基数排序
思想:
分配+收集
1.先分配序号为0—9的十个桶;
2.将待排序序列的中的元素取出,根据个位上的数字分配到与它序号相同的桶中,序列中所有元素都分配完后,按顺序依次收集桶中元素形成一个新的待排序列;
3.对新的序列重复执行分配和收集元素中的十位,百位…直到分配完该序列中的最高位,排序结束。
案例: