其他分享
首页 > 其他分享> > 插入排序

插入排序

作者:互联网

插入排序

介绍:

插入排序(英语:Insertion sort)是一种简单直观的排序算法。它的工作原理为将待排列元素划分为“已排序”和“未排序”两部分,每次从“未排序的”元素中选择一个插入到“已排序的”元素中的正确位置。

性质

稳定性

插入排序是一种稳定的排序算法。

时间复杂度

插入排序的最优时间复杂度为 O(n),在数列几乎有序时效率很高。

此时仅仅遍历了一遍数列。

插入排序的最坏时间复杂度和平均时间复杂度都为O(n^2) 。

#include<bits/stdc++.h>
#define N 105
int a[N];
void Input(int *a,int n){
    int i;
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
}
void Print(int *a,int n){
    int i;
    for(i=0;i<n;i++){
        printf("%d ",a[i]);
    }
}
//读入一个元素,把它往前找,与前面的元素依次比较,放到合适的位置,进而保证前面的都是有序的数列,依次对数列中所有元素进行此操作可以保证数列有序
void insertion_sort(int* a, int n) {
  for (int i = 1; i < n; ++i) {
    int key = a[i];
    int j = i - 1;
    while (j >= 0 && a[j] > key) {
      a[j + 1] = a[j];
      --j;
    }
    a[j + 1] = key;
  }
}
void InsertSort(int a[], int n)
{
    for(int i= 1; i<n; i++){
        if(a[i] < a[i-1]){//若第 i 个元素大于 i-1 元素则直接插入;反之,需要找到适当的插入位置后在插入。
            int j= i-1;
            int x = a[i];
            while(j>-1 && x < a[j]){  //采用顺序查找方式找到插入的位置,在查找的同时,将数组中的元素进行后移操作,给插入元素腾出空间
                a[j+1] = a[j];
                j--;
            }
            a[j+1] = x;      //插入到正确位置
        }
    }
}
int main(void){
    int n,i;
    scanf("%d",&n);
    Input(a,n);
    insertion_sort(a,n);
    Print(a,n);
    InsertSort(a,n);
    Print(a,n);
    return 0;
}

运行展示:Comparison Sorting Visualization (usfca.edu)

标签:int,插入排序,元素,复杂度,排序,void
来源: https://www.cnblogs.com/abldy/p/16323907.html