//请把以下代码粘贴在页首或者侧边栏即可快速部署,若需要更多个性化配置,请继续看下文详细配置

插入排序

插入排序

插入排序

基本思想
将待排序的无序数列看成是一个仅含有一个元素的有序数列和一个无序数列,将无序数列中的元素逐次插入到有序数列中,从而获得最终的有序数列。

算法流程
1.初始时,a[0]自成一个有序区, 无序区为a[1,...,n−1], 令i = 1;
2.将a [ i ] 并入当前的有序区a [ 0 , . . . , i − 1 ] ;
3.i++并重复步骤2,直到i = n − 1, 排序完成。

详细描述如下:

1.从第一个元素开始,该元素可以认为已经被排序
2.取出下一个元素,在已经排序的元素序列中从后向前扫描
3.如果该元素(已排序)大于新元素,将该元素移到下一位置
4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5.将新元素插入到该位置中
6.重复步骤2

复杂度分析:
第1个元素,需要进行 0 次比较;
第2个元素,需要进行 1 次比较;
第3个元素,需要进行 2 次比较;
第n个元素,需要进行n-1次比较;
————————————————


**代码实现:**

#define _CRT_SECURE_NO_WARNINGS 1

#define N 10



#include<stdio.h>

#include<stdlib.h>

#include<string.h>



//插入排序

void insert_Sort(int* arr, int length) {

  int temp, i, j;

  for (i = 1; i < length; i++) {

    temp = arr[i];  //保存要比较的值

    for (j = i - 1; j >= 0 && arr[j] > temp; j--) { //对前i个已经排好序的列表里插入temp

      arr[j + 1] = arr[j]; //依次移动                         

    }

    arr[j + 1] = temp; //插入,此处的arr[j+1]其实是上边的“arr[j]”,执行了一个j--操作

  }

}



//打印元素

void printArr(int* arr, int length) {

  for (int i = 0; i < length; i++) {

    printf("%d\n", arr[i]);

  }

}



int main() {

  int i = 0;

  int arr[N] = { 0 };

  for(i=0;i<N;i++)

    scanf("%d", &arr[i]);

  int length = sizeof(arr) / sizeof(int);

  length = N;

  insert_Sort(arr, length);

  printArr(arr, length);

  return 0;

}


posted @ 2021-10-22 14:44  XQ000  阅读(79)  评论(0)    收藏  举报