headfirst插入排序
2017-11-21 21:13
204 查看
import java.util.Arrays; public class code_01_InsertionSort { public static void insertionSort(int[] arr){ if(arr == null || arr.length < 2){ return; } for(int i = 1; i < arr.length; i++){ for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--){ swap(arr, j, j + 1); } } } public static void swap(int[] arr,int i, int j){ arr[i] = arr[i] ^ arr[j]; arr[j] = arr[i] ^ arr[j]; arr[i] = arr[i] ^ arr[j]; } public static void comparator(int[] arr){ Arrays.sort(arr); } public static int[] generateRandomArray(int maxSize, int maxValue){ int[] arr = new int[(int)((maxSize + 1) * Math.random())]; for (int i = 0; i < arr.length; i++){ arr[i] = (int)((maxValue + 1) * Math.random() - (int)(maxValue * Math.random())); } return arr; } public static boolean isEqual(int[] arr1 , int[] arr2){ if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)){ return false; } if (arr1 == null && arr2 == null){ return true; } if (arr1.length != arr2.length){ return false; } for (int i = 0; i < arr1.length; i++){ if (arr1[i] != arr2[i]){ return false; } } return true; } public static void printArray(int[] arr){ if (arr == null){ return; } for (int i = 0; i < arr.length; i++){ System.out.print(arr[i] + ""); } System.out.println(); } public static int[] copyArray(int[] arr){ if (arr == null){ return null; } int[] res = new int[arr.length]; for (int i = 0; i < arr.length; i++){ res[i] = arr[i]; } return res; } public static void main(String[] args){ int testTime = 500000; int maxSize = 100; int maxValue = 100; boolean succeeed = true; for (int i = 0; i < testTime; i++){ int[] arr1 = generateRandomArray(maxSize, maxValue); int[] arr2 = copyArray(arr1); insertionSort(arr1); comparator(arr2); if (!isEqual(arr1, arr2)){ succeeed = false; break; } } System.out.println(succeeed ? "nice" : "fucker"); int[] arr = generateRandomArray(maxSize, maxValue); printArray(arr); insertionSort(arr); printArray(arr); } }
时间复杂度O(n^2),额外空间复杂度O(1);可以是稳定的,在最优情况下,前面都已经
排好序了,那么每次插入只需要比较一次,最优为O(n)。
相关文章推荐
- 线性表---单链表(创建、插入、删除、排序、测长和打印输出)
- C++向数组内插入一个数并进行排序
- Java排序之插入排序[直接插入排序](3)
- 直接插入排序基本思想
- Ruby插入排序的常规写法和递归写法
- 排序算法之 插入排序
- 排序算法直接插入排序
- 【排序算法 】希尔排序 shell sort(插入类排序)
- 插入排序
- 数据结构-排序: 插入排序(直接插入排序法)
- 插入排序的几种写法及性能上的差别
- 单链表的常用操作,包括单链表的创建、插入、删除、排序、逆置以及打印输出等
- 直接插入排序(Straight Insert Sort)
- 四种简单的排序算法(插入、冒泡、选择排序、快速排序法)+汉诺塔算法
- PHP之八大排序算法--插入排序(-)直接插入排序
- lintcode-链表插入排序
- java排序之伍------插入排序代码
- 单链表的创建、插入、删除、排序以及逆置
- 【初探】直接插入排序
- 插入排序之直接插入排序