文章目录
一、直接插入排序
插入排序由于操作不尽相同, 可分为 直接插入排序 , 折半插入排序(又称二分插入排序), 链表插入排序 , 希尔排序 。我们先来看下直接插入排序。
1、基本思想
直接插入排序的基本思想是:将数组中的所有元素依次跟前面已经排好的元素相比较,
如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过为止。
2、算法描述
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: ①. 从第一个元素开始,该元素可以认为已经被排序
②.取出下一个元素,在已经排序的元素序列中从后向前扫描
③. 如果该元素(已排序)大于新元素,将该元素移到下一位置
④.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⑤. 将新元素插入到该位置后
⑥. 重复步骤②~⑤
3、代码实现
import java.util.Arrays;
import java.util.Random;
public class InsertSort {
public static void main(String[] args) {
Random ran = new Random();
int[] arr = new int[20];
for (int i = 0; i < 20; i++) {
arr[i] = ran.nextInt(100) + 1; 10
}
System.out.println(Arrays.toString(arr));
sort(arr);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr){
int i, tmp;
for( i=1;i<arr.length;i++){
//从第二个数字开始循环,
tmp =arr[i];
int j =i-1;
while(j>=0&&arr[j]>tmp){
arr[j+1] = arr[j];
j--;
}
arr[j+1]= tmp;
System.out.println("第" + i + "次" + Arrays.toString(arr));
}
}
}
二、希尔排序(Shell Sort)
第一个突破O(n^2)的排序算法;是简单插入排序的改进版;
它与插入排序的不同之处在于,它会优先比较距离较远的元素。
希尔排序是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序, 待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
1、基本思想
将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;
每次再将gap折半减小,循环上述操作;当gap=1时,利用直接插入,完成排序
2、算法描述
1.选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;(一般初次取数组半长, 之后每次再减半,直到增量为1)
2. 按增量序列个数k,对序列进行k 趟排序;
3. 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理, 表长度即为整个序列的长度。
3、代码实现
import java.util.Arrays;
import java.util.Random;
/*
希尔排序
*/
public class ShellSort {
public static void main(String[] args) {
Random ran = new Random();
int[] arr = new int[10];
for (int i = 0; i < 10; i++) {
arr[i] = ran.nextInt(100) + 1;
}
System.out.println(Arrays.toString(arr));
shell_sort(arr);
System.out.println(Arrays.toString(arr));25 }
public static void shell_sort(int[] arr) {
int gap = 1, i, j, len = arr.length;
int temp;
while (gap < len / 3)
gap = gap * 3 + 1; // <O(n^(3/2)) by Knuth,1973>: 1, 4, 13, 40, 121, ...
for (; gap > 0; gap /= 3) {
for (i = gap; i < len; i++) {
temp = arr[i];
for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap)
arr[j + gap] = arr[j];
arr[j + gap] = temp;
}
}
}
}
三、选择排序(Selection Sort)
1、基本思想
选择排序的基本思想:比较 + 交换。
2、算法描述
①. 从待排序序列中,找到关键字最小的元素;
②. 如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;
③. 从余下的 N - 1 个元素中,找出关键字最小的元素,重复①、②步,直到排序结束。
3、代码实现
/*
选择排序
*/
public class SelectSort {
public static void main(String[] args)