插入排序 :我在学习一些简单的算法,我用文字记录我的进步。
插入排序 其实就是在待排序列中找到,没有排序好的元素,插入的适当的位置,本文以升序为例,简单的讲解一下。
直接看下面的代码:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
void swap(int array[], int i, int j)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
void printArray(int array[], int len)
{
int i = 0;
for(i=0; i<len; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}
void insert_sort2(int arr[], int len ){
for (int x =1;x<len;x++){
for (int i=x-1;i>=0;i--){
if(arr[i] > arr[i+1]){
// swap
swap(arr,i,i+1);
}else{break;}
}
}
}
void insert_sort(int array[], int len){
int i = 0;
int j = 0;
int k = -1;
int tmp =-1;// i = 0 或者i= 1 开始都可以,array[0] 默认是排好序的。
for (i = 1; i< len;i++){
k = i;// 待插入位置
tmp = array[k];
// 这一轮 待插入的数字
for (j = i - 1; j >= 0 && (array[j] > tmp);j--){
array[j + 1] = array[j];
k = j;// 记录目前的空的位置。 k 记录要插入的位置
}
array[k] = tmp;//元素插入
}
}
int main()
{
int array[]={1,34,6,21,98,31,7,4,36,47,67,39,45,57,37,25,2};
int len = sizeof(array) / sizeof(*array);
printArray(array, len);
insert_sort(array, len);
printArray(array, len);
system("pause");
return 0;
}
简单说明:
insert_sort 核心就是这个函数,就是要把 待排集合中的第一个数字 记录下来,放到了临时变量tmp 中 ,for 外循环 ,从1 --> length-1 ,内循环j 从 i-1 --->0 递减,
如果 j > 0 并且 arr[j]>tmp ,即待排数字, 就要把arr[j] 的值往后移动一下,同时要更新k ,记录 tmp 最后 要放入的位置。 arr[j] 往后移动后,arr[j] 和arr[j+1] 是相同的值, 但是 tmp 已经 记录了 arr[j+1] 的值, 所以不用担心。内循环完成后,说明 k 的值找到了, tmp 的值 赋给 arr[k] 即可。
insert_sort2 是第二种实现, 其实 和第一种 几乎一样, 外循环 也是 x 从 1 ----> length-1 , 内循环 i 从 x-1 ---> 0 这两个 循环完全一样, 不同的是:
arr[i] > arr[i+1] 也是判断这个 如果 后面的数字 比前面的大, 那肯定要 “移动”, 但是这个是直接交换, 思想就是 边交换,边寻找位置, 交换完成, 位置也就放到正确位置。
而算法insert_sort ,采用 先找位置,之后 把值放到相应的位置。分两步。 insert_sort 是边交换,边找位置,同时进行,最后交换完成,位置刚好找好。
结果如下: