排序
1.直接插入排序–插牌
当前有一组待排序序列,大部分是有序的,请问哪种排序方式更适合?
答 : 直接插入排序
思想:[有序区间,无序区间]
每次执行操作:
1.从无序区间抓取第一张牌
2.依次和有序区间的数进行比较【从后往前进行比较–也是个循环】
3.选择合适的位置插入
时间复杂度:
最坏情况(当数据逆序) O(n^2)
最好情况(当数据有序) O(n)
空间复杂度:O(1)
稳定性:稳定
代码实现:
public class DirectInsertSort {
/**
* 时间复杂度:最坏情况(当数据无序) O(n^2)
* 最好情况(当数据有序) O(n)
*
* 所以---》对于直接插入排序:越有序越快
* 空间复杂度:O(1)
* 稳定性:稳定
* @param array
*/
public static void insertSort(int[] array) {
for(int i = 1;i<array.length;i++){
//有序区间:[0,i)
//无序区间:[i,array.length);
int temp = array[i];//无序区间的第一个数
int j = i-1;
for(;j>=0;j--){//temp从后往前与有序区间的数字进行比较
if(temp < array[j]){//如果这里有 = 号就不稳定了
array[j+1] = array[j];//往后移一位
}else{
break;
}
}
array[j+1] = temp;//当j=-1时,这里是array[0] = temp
}
}
public static void main(String[] args) {
int[] array = {10,3,2,7,19,78,65,127};
System.out.println(Arrays.toString(array));
insertSort(array);
System.out.println(Arrays.toString(array));
}
}
2.希尔排序(分组插排)
希尔排序是对直接插入排序的优化
希尔排序中的增量序列中的值没有除1之外的公因子,并且最后一个增量值必须等于1
时间复杂度:最坏情况: O(n^2)
空间复杂度:O(1)
稳定性:不稳定
public class XiErSort {
public static void shell(int[] array ,int gap) {
for(int i = 0;i<array.length;i++){
int temp = array[i];
int j = i-gap;
for(;j>=0;j = j-gap){
if(array[j] > temp){
array[j+gap] =array[j];
}else {
break;
}
}
array[j+gap] = temp;
}
}
public static void shellSort(int[] array) {
int[] drr = {5,3,1};//增量数组
for (int i = 0; i < drr.length; i++) {
shell(array,drr[i]);
}
}
public static void main(String[] args) {
int[] array = {10,7,5,6,90,32};
shellSort(array);
System.out.println(Arrays.toString(array));
}
}