文章目录
综述:
基于比较的算法时间复杂度至少需要O(n×log2n)
内部排序:
当目标长度较短可直接由外村读入内存进行排序时,直接适用内部算法
一、插入排序
直接排序(InsertSort)
相当于每次操作都是对一个已排好序的序列进行排序,找到对应的位置(边比较边移动),用哨兵替代该位置的值
//直接插入排序
static void insertSort(int[] elem){
int i,j;
//从第二位起开始遍历(第0位是哨兵位,第一位是参照位)
for (i = 2; i < elem.length; i++) {
//将哨兵位设置为当前排序元素
elem[0] = elem[i];
//顺序遍历当前排序元素之前的所有元素,查找到目标位置(j+1)
//边查边改,遍历到前一元素与哨兵顺序是一致时(升序/降序)跳出循环
for (j = i-1 ; elem[j]>elem[0] ; j--) {
elem[j+1] = elem[j];
}
//到达j+1
elem[j+1] = elem[0];
}
System.out.println(Arrays.toString(elem));
}
时间复杂度 = O(n2)
稳定性 = 稳定(出现相等元素仍成功)
适应存储 = 顺序存储和链式存储
折半排序(BInsertSort)
在直接排序基础上进行优化,直接排序是在已排序好的序列中进行顺序查找到对应位置,而折半排序是用折半查找到对应位置(high+1)
//折半插入排序
static void insertSort(int[] elem){
int i,j;
int low,mid,high;
//从第二位起开始遍历(第0位是哨兵位,第一位是参照位)
for (i = 2; i < elem.length; i++) {
//将哨兵位设置为当前排序元素
elem[0] = elem[i];
//折半遍历当前排序元素之前的所有元素,查找到目标位置(high+1)
while(low>=high){
mid = (low+high)/2;
if(elem[mid] > elem[0]){
high = mid - 1;
}else{
lwo = mid + 1;
}
}
//边移动边改
for (j = i-1 ; j>=hgih+1 ; j--) {
elem[j+1] = elem[j];
}
//到达high+1
elem[high+1] = elem[0];
}
System.out.println(Arrays.toString(el