插入排序
前言
最近学校在开设算法设计与分析,是时候做个总结啦
基本思想与方法
插入排序(insertion sort)的基本思想:每次将一个待排序的记录,按其关键字大小插入到前面已经排序好的序列中,直到全部记录插入完成为止.
假设待排序的记录存放在数组A[1…n]中。初始时,A[1]自成1个有序区,无序区为A[2…n].从i = 2起直到i = n 为止,依次将A[i]插入当前的有序区R[1…i - 1]中,生成含n个记录的有序区.
文字描述
将待插入记录R[i]的关键字从右向左依次与有序区中记录A[j](j=i - 1, i - 2, …,1)的关键字比较:
1.若A[j]的关键字大于R[i]的关键字,则A[j]后移一个位置
2。若A[j]的关键字小于或等于A[i]的关键字,则查找过程结束,j + 1即为A[i]插入位置
伪代码描述
算法导论给出伪代码如下:
动图演示
C语言代码实现
#include<stdio.h>
#include<stdlib.h>
void insertSort(int*, int);
int main() {
int num[10];
for (int i = 0; i < 10; i++) {
scanf("%d", num + i);
}
insertSort(num, 10);
for (int i = 0; i < 10; i++) {
printf("%d ", num[i]);
}
printf("\n");
system("pause");
return 0;
}
void insertSort(int *arr, int len) {
int i, j, temp;
for (i = 1; i <len; i++) {
temp = arr[i];
for (j = i - 1; j >= 0; j--) {
if (arr[j] > temp) {
arr[j + 1] = arr[j];
}
else {
break;
}
}
arr[j + 1] = temp;
}
}
Java代码实现
public class InsertSort {
public static void main(String[] args){
int[] arr = {10,9,8,7,6,5,4,3,2,1};
insertSort(arr,10);
for(int i=0;i<10;i++){
System.out.print(arr[i]+" ");
}
}
static void insertSort(int[] arr,int len){
int i,j,temp;
for(i=1;i<len;i++){
temp =arr[i];
for(j=i-1;j>=0;j--){
if(arr[j]>temp){
arr[j+1]=arr[j];
}else{
break;
}
}
arr[j+1]=temp;
}
}
}
python代码实现
def insertSort(arr):
i=1
for i in range(len(arr)):
key =arr[i]
j =i-1
while j>=0 and arr[j]>key:
arr[j+1]=arr[j]
j-=1
arr[j+1]=key
arr=[10,9,8,7,6,5,4,3,2,1]
insertSort(arr)
print(arr)
算法效率分析
(1)时间复杂度:
即只需要比较一次
待排序元素比已排序子序列中每个元素都小
(2)最坏空间复杂度:待排序数组空间大小O(n),辅助空间大小为O(1)
(3)稳定性:插入排序具有稳定性,因为具有同一值的元素必然插在具有同一值得前一个元素的后面,即相对次序不变.