插入排序
持续更新算法与数据结构,感兴趣看下其他文章
插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。3.1 算法描述一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
1.从第一个元素开始,该元素可以认为已经被排序;
2.取出下一个元素,在已经排序的元素序列中从后向前扫描;
3.如果该元素(已排序)大于新元素,将该元素移到下一位置;
4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
5.将新元素插入到该位置后;重复步骤2~5。
代码
java
package sort;
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
//int arr[] = {1,3,2,4,9,6,7,5,8,10};
int arr[] = {101,34,119,1};
System.out.println("排序前:");
System.out.println(Arrays.toString(arr));
insertSort(arr);
System.out.println("排序后:");
System.out.println(Arrays.toString(arr));
}//main
public static void insertSort(int[] arr){
System.out.println("...........................");
//第一轮
int insertVal = arr[1];
int insertIndex = 1-1;//arr[1]前面数的下标
//给insertVal找到插入位置
/**说明
* 1.insertIndex》=0保证insertVal找插入位置,且不越界
* 2.insetVal《arr【insertIndex】 还没找到插入位置
* 3.将arr[insertindex]后移
* */
while(insertIndex >= 0 && insertVal < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
//退出循环时 insertIndex+1 因为退出循环前--
arr[insertIndex + 1] = insertVal;
System.out.println("第一轮插入:");
System.out.println(Arrays.toString(arr));
//第二轮
insertVal = arr[2];
insertIndex = 2-1;//arr[1]前面数的下标
//给insertVal找到插入位置
/**说明
* 1.insertIndex》=0保证insertVal找插入位置,且不越界
* 2.insetVal《arr【insertIndex】 还没找到插入位置
* 3.将arr[insertindex]后移
* */
while(insertIndex >= 0 && insertVal < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
//退出循环时 insertIndex+1 因为退出循环前--
arr[insertIndex + 1] = insertVal;
System.out.println("第二轮插入:");
System.out.println(Arrays.toString(arr));
//第三轮
insertVal = arr[3];
insertIndex = 3-1;//arr[1]前面数的下标
//给insertVal找到插入位置
/**说明
* 1.insertIndex》=0保证insertVal找插入位置,且不越界
* 2.insetVal《arr【insertIndex】 还没找到插入位置
* 3.将arr[insertindex]后移
* */
while(insertIndex >= 0 && insertVal < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
//退出循环时 insertIndex+1 因为退出循环前--
arr[insertIndex + 1] = insertVal;
System.out.println("第三轮插入:");
System.out.println(Arrays.toString(arr));
System.out.println("...........................");
//总结
for (int i = 1; i < arr.length; i++) {
insertVal = arr[i];
insertIndex = i-1;//arr[1]前面数的下标
//给insertVal找到插入位置
/**说明
* 1.insertIndex》=0保证insertVal找插入位置,且不越界
* 2.insetVal《arr【insertIndex】 还没找到插入位置
* 3.将arr[insertindex]后移
* */
while(insertIndex >= 0 && insertVal < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
//退出循环时 insertIndex+1 因为退出循环前--
arr[insertIndex + 1] = insertVal;
System.out.println("第"+i+"轮插入:");
System.out.println(Arrays.toString(arr));
}
System.out.println("...........................");
//for---自己
int temp;
for (int i = 1; i < arr.length; i++) {//从第二个元素开始
temp = arr[i];
for (int j = i - 1; j >= 0; j--) {
if(temp > arr[j]) {
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
System.out.println("...........................");
}//sort
}//主类
c语言
/**
* 插入排序
* @param array
* @return
*/
public static int[] insertionSort(int[] array) {
if (array.length == 0)
return array;
int current;
for (int i = 0; i < array.length - 1; i++) {
current = array[i + 1];
int preIndex = i;
while (preIndex >= 0 && current < array[preIndex]) {
array[preIndex + 1] = array[preIndex];
preIndex--;
}
array[preIndex + 1] = current;
}
return array;
}