稳定排序:相同值元素排序之后前后相对顺序不变
1、不稳定排序:选择排序,希尔排序,快速排序,堆排序 快选希堆
2、稳定排序:插入排序,冒泡排序,归并排序,计数排序 插冒归计
原地排序:直接在原数组上进行,不申请额外数组空间
非原地排序:归并排序
十大排序算法
1、选插冒 O(n*n)
(1) 选择排序:(有序区,无序区); 在无序区中选择最小元素与无序区首元素交换; 无序区最小元素归位; 不稳定、原地排序
(2) 冒泡排序:(无序区,有序区); 相邻元素两两比较,将大元素后移 无序区最大元素归位; 稳定、原地排序
(3) 插入排序:(有序区,无序区); 无序区首元素,在有序段中查找位置并插入; 无序区首元素归位; 稳定、原地排序
2、 快归希堆 O(n*log(n))
(1) 快速排序:区间首元素作为基准元素,<=放到其左边,>=放到其右边 基准元素归位,再分别调整左/右子区间; 非稳定排序 ; (代码注意:二重while循环中都取到等号;最后交换l与y位置的元素)
(2) 归并排序: 划分为两个子区间,分别排序再将排序结果合并; 左右子数组比较; 稳定、非原地排序
(3) 希尔排序: 不断缩小间距gap/2,每次都是插入排序(快速插入:通过间距来减少移动次数) ; 非稳定、原地排序
(4) 堆排序: 维护大顶堆 首先[n/2-1,…,0]调整构建一个大顶堆,然后每次将堆顶元素归位并调整大顶堆; 堆顶元素归位; 非稳定、原地排序
3、其他排序
(1) 计数排序: 最大/最小值相差不大, 统计各元素出现频次,然后从小到大整合
(2) 基数排序:按照个位、十位、百位…分别进行排序 (桶大小为10)
(3) 桶排序: 计算最大值与最小值,根据差分成多个桶/区间,将所有元素放入桶中 每个小桶排序后再按顺序整合到一起
// 选择排序 “有序段|无序段” 每次将无序段最小元素归位
public static void ChooseSort(int[] nums){
for(int i=0;i<nums.length;i++){
int tmp=nums[i],k=i;
for(int j=i+1;j<nums.length;j++){
if(nums[j]<tmp){
tmp&#