一. 算法描述
插入排序:插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序。例如有一个长度为N的无序数组,进行N-1次的插入即能完成排序;第一次,数组第1个数认为是有序的数组,将数组第二个元素插入仅有1个有序的数组中;第二次,数组前两个元素组成有序的数组,将数组第三个元素插入由两个元素构成的有序数组中......第N-1次,数组前N-1个元素组成有序的数组,将数组的第N个元素插入由N-1个元素构成的有序数组中,则完成了整个插入排序。
以下面5个无序的数据为例:
65 27 59 64 58 (文中仅细化了第四次插入过程)
第1次插入: 27 65 59 64 58
第2次插入: 27 59 65 64 58
第3次插入: 27 59 64 65 58
第4次插入: 27 58 59 64 65
二. 算法分析
平均时间复杂度:O(n2)
空间复杂度:O(1) (用于记录需要插入的数据)
稳定性:稳定
三、代码
1、自己写的代码: public static void insrtionSort(int[] arr){ //定义临时变量存储位置i上的变量值 int temp=0; //外层循环从arr[1]开始遍历,总共执行N-1次(趟) for (int i = 1; i < arr.length; i++) { //对于每次比较,知道找到正确位置插入为止 for (int j = i; j >0; ) { //任意两个元素的比较 if(arr[j]<arr[j-1]){ temp=arr[j-1]; arr[j-1]=arr[j]; arr[j]=temp; //如果执行比较交换数据,则再往前推进 j--; }else{ //如果位置正确,则跳出循环 break; } } } } public static void main(String[] args) { int [] arr=new int[]{34,8,64,51,32,2,212,32,-1,-9,1214,21,212,345,1,34,1,0,100,22,21}; //定义一个中间变量 insrtionSort(arr); System.out.println(Arrays.toString(arr)); } 2、借鉴其他博主: 1、 /******************************************************** *函数名称:InsertSort *参数说明:pDataArray 无序数组; * iDataNum为无序数据个数 *说明: 插入排序 *********************************************************/ void InsertSort(int* pDataArray, int iDataNum) { for (int i = 1; i < iDataNum; i++) //从第2个数据开始插入 { int j = 0; while (j < i && pDataArray[j] <= pDataArray[i]) //寻找插入的位置 j++; if (j < i) //i位置之前,有比pDataArray[i]大的数,则进行挪动和插入 { int k = i; int temp = pDataArray[i]; while (k > j) //挪动位置 { pDataArray[k] = pDataArray[k-1]; k--; } pDataArray[k] = temp; //插入 } } } 2、 public static void insertion_sort(int[] unsorted) { for (int i = 1; i < unsorted.length; i++) { if (unsorted[i - 1] > unsorted[i]) { int temp = unsorted[i]; int j = i; while (j > 0 && unsorted[j - 1] > temp) { unsorted[j] = unsorted[j - 1]; j--; } unsorted[j] = temp; } } } public static void main(String[] args) { int[] x = { 6, 2, 4, 1,-12,21,31, 5, 9 }; insertion_sort(x); System.out.println(Arrays.toString(x)); }
时间: 2024-10-03 19:12:30