参考:
https://jingyan.baidu.com/article/fd8044fa79a7265031137aad.html
个人比较容易搞混的:
1,简单选择排序:【第一个位置上的数与之后的进行比较!最后结果就是,第一个数是最小的数!】
先将第一个位值上的数跟之后所有位置上的数依次进行比较,如果第一个位置上的数比第二个位置上的数大,则进行互换,然后继续将第一个位置上的数与第三个位置上的数进行比较,经过一轮的比较后,第一个位值上的数就是所有数中最小的一个,如此往复。
2,快速排序:【选择一个基准数。剩下的与之比较!】
- 从序列当中选择一个基准数(pivot)
在这里我们选择序列当中第一个数作为基准数 - 将序列当中的所有数依次遍历,比基准数大的位于其右侧,比基准数小的位于其左侧
- 重复步骤1.2,直到所有子集当中只有一个元素为止。
八大排序:
插入排序类:
1,直接插入排序:
给定的一组记录,将其分为两个序列组,一个为有序序列(按照顺序从小到大或者从大到小),一个为无序序列。
初始时,将记录中的第一个数当成有序序列, 剩下其他所有数都当做是无序序列组中的数据。
然后将无序序列组中的数据插入到有序序列的适当位置。
2,希尔排序:
是插入排序的操作,但是希尔排序并不是把一组记录看成一个整体,而将整个记录分为了若干组记录,然后在对每组记录进行插入排序。
选择排序类:
1,简单选择排序:
先将第一个位值上的数跟之后所有位置上的数依次进行比较,如果第一个位置上的数比第二个位置上的数大,则进行互换,然后继续将第一个位置上的数与第三个位置上的数进行比较,经过一轮的比较后,第一个位值上的数就是所有数中最小的一个,如此往复。
2,堆排序:
分为大顶堆和小顶堆,大顶堆要求节点的元素都要大于其孩子,小顶堆要求节点元素都小于其左右孩子,两者对左右孩子的大小关系不做任何要求。
大堆排序:取出堆的根节点,放在待排序序列最后一位,重复此过程。直至堆中只有1个元素为止。小堆排序反之!
交换排序类:
1,冒泡排序:
- 将序列当中的左右元素,依次比较,保证右边的元素始终大于左边的元素;
( 第一轮结束后,序列最后一个元素一定是当前序列的最大值;) - 对序列当中剩下的n-1个元素再次执行步骤1。
- 对于长度为n的序列,一共需要执行n-1轮比较
(利用while循环可以减少执行次数)
2,快速排序:
- 从序列当中选择一个基准数(pivot)
在这里我们选择序列当中第一个数作为基准数 - 将序列当中的所有数依次遍历,比基准数大的位于其右侧,比基准数小的位于其左侧
- 重复步骤1.2,直到所有子集当中只有一个元素为止。
归并排序:
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
分开进行排序,然后再将结果合并到一起!
基数排序:
基数排序:通过序列中各个元素的值,对排序的N个元素进行若干趟的“分配”与“收集”来实现排序。
分配:我们将L[i]中的元素取出,首先确定其个位上的数字,根据该数字分配到与之序号相同的桶中
收集:当序列中所有的元素都分配到对应的桶中,再按照顺序依次将桶中的元素收集形成新的一个待排序列L[ ]
对新形成的序列L[]重复执行分配和收集元素中的十位、百位...直到分配完该序列中的最高位,则排序结束
龙哥,给我讲了287 ,386的例子。
第一次是386,6比7小放在第一个桶里。第二次是十位,分配还会按照之前排序进行。第三次就是百位。
百位比较完之后,没有更高位了。排序结束。
OK