基础算法学习--插入排序
参考 http://blog.verypod.com/shell-sort-using-java/
http://blog.csdn.net/shan9liang/article/details/7533466
排序算法早就学习过,无奈长时间不看还是有很多知识变的模糊。从今天开始每天回顾一下那些年学过的算法。今天回顾的是直接插入排序。在算法的结构中直接插入排序属于插入排序的一种,和直接插入排序同属插入排序的是希尔排序。关系如下:
直接插入排序的基本操作是:将一个记录插入到已经排好序的有序表中, 得到一个新生成的有序表。当所有待排序的记录都插入得到新生成的有序表中时,排序结束。
java算法实现
public static void main(String[] args) { int numbers[] = { 23, 53, 11, 34, 51 }; sort(numbers); } public static void sort(int[] list) { int number[] = list; int temp = 0;//暂存 for (int i = 1; i < number.length; i++) { int j; temp = number[i];//暂存 for (j = i - 1; j >= 0 && temp < number[j]; j--) { number[j + 1] = number[j]; // 后移 } number[j + 1] = temp; } for (int i = 0; i < number.length; i++) System.out.println("The "+i+" number is :"+number[i]); }
分析:直接插入排序的时间复杂度为O(N平方),当带排序队列为递增有序时,时间复杂度为O(N)。
希尔排序的基本思想是:先将整个待排序的队列(n个数字)按照一定间隔(d)分割成若干个子序列,各个子序列中采用直接插入排序进行排序,然后再整体排序一次。
Java算法实现:
import java.util.Random; public class ShellSort { int[] data; public ShellSort(int num) { data = new int[num]; } /** * 将data数组初始化为随机数数组 */ public void randomArray() { Random rd = new Random(); for (int i = 0; i < data.length; i++) { data[i] = rd.nextInt(data.length * 2); } } /** * 将data数组初始化为倒序数组 */ public void reverseArray() { for (int i = 0; i < data.length; i++) { data[i] = data.length - i; } } /** * 打印数组 */ public void display() { for (int i = 0; i < data.length; i++) { System.out.print(data[i] + " "); } System.out.println(""); } /** * 希尔排序 */ public void shellSort() { int interval = 1; while (interval < data.length) { interval = interval * 3 + 1; } interval = (interval - 1) / 3; while (interval >= 1) { for (int i = 0; i < interval; i++) { insertSort(i, interval); } display(); System.out.println("interval is : " + interval); interval = (interval - 1) / 3; } } /** * 插入排序,该方法会被希尔排序调用 * * @param startIndex * 是排序起始索引 * @param interval * 元素之间的间隔 */ public void insertSort(int startIndex, int interval) { for (int i = startIndex + interval; i < data.length; i += interval) { int j = i - interval; int temp = data[i]; while (j >= startIndex && temp < data[j]) { data[j + interval] = data[j]; j -= interval; } data[j + interval] = temp; } } public static void main(String[] args) { ShellSort shellSort = new ShellSort(2); shellSort.reverseArray(); // shellSort.randomArray(); shellSort.display(); shellSort.shellSort(); shellSort.display(); } }