目录
稳定性概念
稳定性概念
简单的说就是俩个相等的数据,经过排序后,排序算法能保证其相对位置不变。
(插入排序,冒泡排序,归并排序都是稳定的)
1.插入排序
特点:数组短,排序效率高;数组相对有序,排序效率也高;
时间复杂度:O(N*2)
空间复杂度:O(1)
稳定
代码:
public static void insertSort(int[] arr){
int bound=1;
//[0,bound)已排序区间
//[bound,length)待排序区间
for (;bound<arr.length;bound++){
//里面每次要执行具体的比较插入过程了
//取出待排序区间的最开始元素
int v=arr[bound];
int cur=bound-1;
for (;cur>=0;cur--){
//这个循环就是在执行比较插入的细节
//拿着 v 这个值依次往前进行比较,找到合适位置
if (arr[cur]>v){
//说明v应该插入到arr[cur]之前
//于是就得把cur位置的元素往后搬运一个格子
arr[cur+1]=arr[cur];
}else{
//说明已经找到了合适的位置,结束循环
//所谓的合适位置就是cur+1这个下标
break;
}
}
arr[cur+1]=v;
}
}
2.希尔排序
建立在插入排序的基础上,代码相似于插入排序,其实就是将数组进行分组插排
时间复杂度:O(N*2)
空间复杂度:O(1)
不稳定
代码:
private static void _shellSort(int[] arr, int gap) {
//进行分组插排,分组依据就是gap
//gap也表示分的组数
//同组的相邻元素,下标差值就是gap
//下面的代码和插入排序是一样的
int bound = gap;
for (; bound < arr.length; bound++) {
int v = arr[bound];
int cur = bound - gap;
for (; cur >= 0; cur -= gap) {
//进行搬运
if (arr[cur] > v) {
arr[cur + gap] = arr[cur];
} else {
break;
}
}
arr[cur+gap]=v;
}
}
3.选择排序
①分成已排区间(空)和待排序区间;
②从0号元素开始依次跟后边元素比较,若0号大,换位置,若0号小,一直往后比