“插入排序法” 基本原理
从将要排序的对象中每次选择一个值,按照非递减(从小到大)(或非递增(从大到小))顺序与前面已经排好顺序的数比较,然后将数字插入到合适位置处。之后每次选择一个未排序的数字与前面已排序的数字进行比较,再插入适当位置,以此类推,直至排序完成。
如下所示:
排序前:92 77 67 8 6 84 55 85 43 67
第1步:[77 92] 67 8 6 84 55 85 43 67 将77插入92前
第2步:[67 77 92] 8 6 84 55 85 43 67 将67插入77前
第3步:[8 67 77 92] 6 84 55 85 43 67 将8插入67前
第4步:[6 8 67 77 92] 84 55 85 43 67 将6插入8前
第5步:[6 8 67 77 84 92] 55 85 43 67 将84插入92前
第6步:[6 8 55 67 77 84 92] 85 43 67 将55插入67前
第7步:[6 8 55 67 77 84 85 92] 43 67 将85插入92前
第8步:[6 8 43 55 67 77 84 85 92] 67 将43插入55前
第9步:[6 8 43 55 67 67 77 84 85 92] 将67插入67前
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 10
void insort(int number[]){
int i, j, k, tmp;
for(j = 1; j < MAX; j++){
tmp = number[j];
i = j - 1;
while(tmp < number[i]){
number[i+1] = number[i];
i--;
if(i == -1){
break;
}
}
number[i+1] = tmp;
printf("第 %d 次排序:", j);
for(k = 0; k < MAX; k++){
printf("%d ", number[k]);
}
printf("\n");
}
}
int main(){
int number[MAX] = {0};
int i;
srand(time(NULL)); //刷新每次产生的随机数,若无此句,每次随机数相同,亲自尝试一下便知
printf("\n插入排序:\n\n");
printf("排序前:");
for(i = 0; i < MAX; i++){
number[i] = rand() % 100; //产生0-99的随机数,这里没有采用固定的数组值进行排序,随机生成
printf("%d ", number[i]);
}
printf("\n\n");
insort(number);
return 0;
}