七大排序
一、排序分类
二、算法实现
都以升序为例。
1.插入排序
1.1 实现步骤
- 遍历数组
- 每遍历到一个元素arry[i],将其与之前的有序区间(array[0]~array[i-1])从后向前逐一比较,array[i]<其则交换,直至array[i]>=其跳出本次循环。
1.2 代码
- 设定循环次数,for(int i=1;i<length;i++),第1个数不用插入;
- 从最后一个数开始向前循环,如果插入数小于当前数,就将当前数向后移动一位;
- 将当前数放置到空着的位置,即j。
public static void insertSort(int[] array){
for(int i = 1;i <= array.length-1;i++){
int val = array[i];
for (int j = i-1;j >= 0 && array[j] > val;j--){
array[j+1]=array[j];
array[j]=val;
}
}
System.out.println(Arrays.toString(array));
}
1.3 时间复杂度
- 最好情况下:在本身有序的情况下,共比较了n-1次,没有移动的记录,时间复杂度为O(n)。
- 最坏情况下:在逆序情况下:比较了 n(n-1)/2次,而移动次数为(n+2)(n-2)/2次。
- 平均比较:移动次数是n ^ 2/4,故直接插入排序的时间复杂度为O(n^2)。
- 直接插入排序法比冒泡和简单选择排序的性能要好一些。
2.希尔排序
2.1 实现步骤
- 将所有的数每次进行分组,一组数之间的间隔我们将其称为分组增量gap(gap = size或gap = gap / 3 + 1或gap = gap / 2)
- 对于每一组都进行插入排序
- gap由大变小最后逐渐减小为0
例如:
第一次增量的取法为:gap=size/2;
第二次增量的取法为:gap=(size/2)/2;
最后一直到: gap=1;
2.2 代码
- 确定分的组数gap;
- 对组中元素进行插入排序;
- 然后将gap/2,重复1,2步,直到gap=1为止。
public static void shellSort(int[] array){
int gap = array.length/2;
while (gap >= 1) {
for (int i = gap; i < array.length; i++) {
int j = 0;
int temp = array[i];
for (j = i - gap; j >= 0 && array[j] > temp; j -= gap) {
array[j + gap] = array[j];
}
array[j + gap] = temp;
}
gap = gap/2;
}
System.out.println(Arrays.toString(array));
}
2.3 时间复杂度
- 时间复杂度为O(n^1.5)
- 希尔排序因为是跳跃式记录,所以是一个不稳定的排序算法