最近从网易公开课在看麻省理工学院的公开课《算法导论》,感觉还不错,接下来几篇文章所示学习日记了,不准备对算法细节做过多描述,感兴趣的可以自己去看。
文章分几篇讲经典排序算法,直接上代码,根据结果对算法性能有个直观了解。本篇先说插入排序(insertion sort)。
(一)算法实现
1 protected void sort(int[] toSort) { 2 if (toSort.length <= 1) { 3 return; 4 } 5 for (int i = 1; i < toSort.length; i++) { 6 if (toSort[i] < toSort[i - 1]) { 7 int j = i; 8 int temp = toSort[i]; 9 while (j > 0 && temp < toSort[j - 1]) {10 toSort[j] = toSort[j - 1];11 j--;12 }13 toSort[j] = temp;14 }15 }16 }
1)插入排序属于原地排序,节省空间
2)插入排序的时间复杂度是O(n2)
3)插入排序属于比较排序
4)插入排序属于稳定排序算法
(二)算法性能
**************************************************
Number to Sort is:2500Array to sort is:{665184,192100,475135,171530,869545,506246,640618,543738,91353,493005...}Cost time of 【InsertionSort】 is(milliseconds):3Sort result of 【InsertionSort】:{856,985,2432,3792,3910,3915,4423,4516,4653,4780...}**************************************************Number to Sort is:25000Array to sort is:{99880,631403,265087,597224,876665,955084,996547,879081,197806,926881...}Cost time of 【InsertionSort】 is(milliseconds):267Sort result of 【InsertionSort】:{14,14,17,83,97,152,179,199,240,299...}**************************************************Number to Sort is:250000Array to sort is:{777293,731773,508229,920721,338608,707195,940,445210,19071,768830...}Cost time of 【InsertionSort】 is(milliseconds):21,523Sort result of 【InsertionSort】:{2,7,7,19,19,21,24,29,30,39...}相关代码:
1 package com.cnblogs.riyueshiwang.sort; 2 3 import java.util.Arrays; 4 5 public class InsertionSort extends abstractSort { 6 @Override 7 protected void sort(int[] toSort) { 8 if (toSort.length <= 1) { 9 return;10 }11 for (int i = 1; i < toSort.length; i++) {12 if (toSort[i] < toSort[i - 1]) {13 int j = i;14 int temp = toSort[i];15 while (j > 0 && temp < toSort[j - 1]) {16 toSort[j] = toSort[j - 1];17 j--;18 }19 toSort[j] = temp;20 }21 }22 }23 24 public static void main(String[] args) {25 for (int j = 0, n = 2500; j < 3; j++, n = n * 10) {26 System.out27 .println("**************************************************");28 System.out.println("Number to Sort is:" + n);29 int[] array = CommonUtils.getRandomIntArray(n, 1000000);30 System.out.print("Array to sort is:");31 CommonUtils.printIntArray(array);32 33 int[] array1 = Arrays.copyOf(array, n);34 new InsertionSort().sortAndprint(array1);35 }36 }37 }
1 package com.cnblogs.riyueshiwang.sort; 2 3 import java.text.MessageFormat; 4 5 public abstract class abstractSort { 6 /** 7 * 8 * @param toSort 9 * array to sort10 */11 protected abstract void sort(int[] toSort);12 13 public void sortAndprint(int[] toSort) {14 Long begin = System.currentTimeMillis();15 sort(toSort);16 Long end = System.currentTimeMillis();17 System.out.println(MessageFormat.format(18 "Cost time of 【{0}】 is(milliseconds):{1}", this.getClass()19 .getSimpleName(), (end - begin)));20 System.out.print(MessageFormat.format("Sort result of 【{0}】:", this21 .getClass().getSimpleName()));22 CommonUtils.printIntArray(toSort);23 }24 25 }
1 package com.cnblogs.riyueshiwang.sort; 2 3 import java.util.Random; 4 5 public class CommonUtils { 6 private static Random random = new Random(); 7 8 public static void printIntArray(int[] array) { 9 System.out.print('{');10 11 int length = Math.min(array.length, 10);12 for (int i = 0; i < length; i++) {13 System.out.print(array[i]);14 if (i != length - 1) {15 System.out.print(',');16 } else {17 if (array.length > 10) {18 System.out.print("...");19 }20 System.out.println('}');21 }22 }23 }24 25 public static int[] getRandomIntArray(int size, int maxValue) {26 int[] array = new int[size];27 for (int i = 0; i < size; i++) {28 array[i] = random.nextInt(maxValue);29 }30 return array;31 }32 33 public static void swap(int[] toSort, int i, int j) {34 int temp = toSort[i];35 toSort[i] = toSort[j];36 toSort[j] = temp;37 }38 }