- 什么是插入排序?
插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。 - 实战
有这样一个数组
int arr[]={ 2,5,1,4,3,6 }
现在开始进行插入排序
从左往右开始排
虚拟一个变量key来存放要插入的数。
虚拟一个变量site 存放要插入的数原本的位置。
首先认定 0 位置上的 2 ,已经是排好的序列了。
那么我们就是从第 1 个位置开始进行比较插入。
进行第一次比较
将第 1 位置上的 5 存入变量key ,并将位置 1 存入site。用这个key值来和前一位置上的值 2 进行比较,由于 5 是大于 2 的 ,因此将 5 插入到 2 后面的一个位置 既刚刚变量 site 记录的 1 号位,值为 5 。此时arr数组是这样的:{ 2,5,1,4,3,6 }
进行第二次比较
将 2 位置上的值 1 存入变量key,并将位置 2 存入变量site,然后开始与 1 号位的值 5 进行比较。由于值1是小于5的,所以将1号位上的值5赋值给2号位。如果此时print的话 ,是这样的:{ 2,5,5,4,3,6 } , 再次 与 0 号位的值 2 做比较。1依然是小于值 2 的,所以此时将 值 2 后移一位,赋值给 1 号位,此时print的话是这样的{ 2,2,5,4,3,6 } 。 由于已经是比较到最前面的位置了,即 0 号位,不能在比较插入。此时将key的值赋值给site位,即 0 号位,此时是这样的{ 1,2,5,4,3,6 }
依次类推:
第三次 { 1,2,4,5,3,6 }
第四次 { 1,2,3,4,5,6 }
3, 代码
从1号位开始比较,一共比较多少次?
for(int i =0;i<arr.length-1;i++){}
虚拟变量存放 值 和 位置
int key = arr[i];
int site= i ;
开始比较
while(site>=0 && arr(site-1)>key){
arr[site] = arr[ site -1] ;
site -- ;
}
最后将当前元素插入:
arr[site] = key ;
完整代码是这样的:
int arr[] ={ 2,5,1,4,3,6,7};
for (int i = 1; i < arr.length-1; i++) {
int key = arr[i];
int site = i;
while (site > 0 && arr[site - 1] > key) {
arr[site] = arr[site - 1];
site--;
}
arr[site] = key;
}
}
补张图
收工,结束。