一、分类总结
插入排序:都要求是在已经有序的序列中,插入新的元素,直到所有的元素插入完成。
选择排序:选择一个满足条件的放入有序队列,再遍历剩下的无序列表继续选择,直到所有数据有序。
交换排序:每次保证一个有序数到达相应位置
二路归并:在保证“二路”有序的基础上进行归并
基数排序:
二、部分算法代码实现(以升序排序为例)
一、插入排序
(一)直接插入排序
思想:从初始位置遍历数组,每一次遍历都想一个关键字按照其数值的大小插入到“已经排好的、部分有序”序列的适当位置,直到所有待排关键字都被插入到有序序列中为止。
稳定性:稳定的
时间复杂度:O(n^2)
public static void ZJinsertSort(int[] nums){
System.out.print("before sort:");
for (int i=0;i<nums.length;i++){
System.out.print(nums[i]+" ");
}
for(int i=1; i<nums.length;i++){
int temp = nums[i];
int j = i-1;
//while里面必须用temp,因为nums[i]会因为nums[j]的移动而发生变化
while(j>=0&&temp<nums[j]){
nums[j+1] = nums[j];
--j;
}
nums[j+1] = temp;
}
System.out.print("\nafter sort:");
for (int i=0;i<nums.length;i++){
System.out.print(nums[i]+" ");
}
}
before sort:51 35 60 88 76 9 17 51
after sort:9 17 35 51 51 60 76 88
(二)折半插入排序
思想:从头开始遍历,i为当前要插入的元素。对下标i对应的元素在0-i的有序序列中进行折半查找,找到要插入的数据的位置index,将i-1到index的元素后移,在index的位置插入i对应的值。
稳定性:稳定的
时间复杂度:O(n^2)
下面代码偷懒了…没有按照思路来,利用了java中ArrayList中的动态插入性质插入一个元素。
public static void ZBsrot(List<Integer> nums, int insertnum){
int index = ZBserach(nums,insertnum);
//java的ArrayList中add(int,Object)方法自动向后顺延,不会覆盖
nums.add(index,insertnum);
}
//查找插入位置
public static int ZBserach