内容参考:十大经典排序算法
归并排序
基本思想:
将待排序元素分为大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排好序的子集合并成为所要求的排好序的集合
JAVA实现
|
|
C++实现
|
|
快速排序
基本思想
对于输入的数组a[p:r]
-
分解:以a[p]为基准元素将a[p:r]分为3段a[p:q-1],a[q]和a[q+1:r]
使得a[p:q-1]中任何元素小于等于a[q]
a[q+1:r]中任何元素大于等于a[q] -
递归求解:通过递归调用排序算法,分别对q[p:q-1]和a[q+1:r]进行排序
-
合并:由于对a[p:q-1]和a[q+1:r]的排序是就地进行,所以在a[p:q-1]和a[q+1:r]完成排序后无需额外计算,a[p:r]的排序就已经完成
JAVA实现
|
|
C++实现
|
|
冒泡排序
主要思想:
- 对一对相邻的元素比较,前者大于后者则交换它们
- 对数组中所有元素都做此操作,直到最后,最大的数会向泡泡一样冒到数组末尾
- 重复操作,每次都跳过上一次的最后一个元素,直到没有元素需要比较
JAVA
|
|
C++
|
|
选择排序
主要思想
- 在没排序的序列中找到最小的元素,存放到开始位置
- 在剩余元素中找到最小元素,存放到前一个元素的下一个位置
- 重复步骤直到完成
JAVA
|
|
C++
|
|
插入排序
- 将第一个元素视为已排列的有序数组,之后的元素视为未排列的无序数组
- 从头到尾依次遍历未排序序列,将遍历到的元素插入到有序数组的适当位置
JAVA
|
|
C++
|
|
希尔排序
- 将整个待排列数组分为增量序列
- 按照增量序列的个数K,对序列进行k趟排序
- 每次排序时根据的值将未排序序列分割为若干个长度为m的子序列,分别进行插入排序。当i为1时,整个序列视为一个表
JAVA
|
|
C++
|
|
堆排序
- 将要排序的数组构造为堆,根据升序或降序选择大顶堆或小顶堆
- 互换堆首和堆尾
- 将堆的尺寸缩小1,将新的数组顶点位置调整到对应位置
- 重复步骤2,直到堆的尺寸为1
JAVA
|
|
C++
|
|
计数排序
- 找出待排序的数组中国最大和最小的元素,从而确定缓存数组的最大长度
- 根据每个值为i的元素出现的次数,存入缓存数组的第i项
- 累加所有计数
- 反向填充目标数组
JAVA
|
|
C++
|
|
桶排序
- 利用函数映射关系将待排序数组的元素分配到桶中
- 将元素在桶中排序
|
|
C++
|
|
基数排序
将整数按位数分割为不同数字,按各位数比较大小
在桶的分配方式上根据键值的每位数字来分配桶
|
|
C++
|
|