简单排序:直接插入排序

Posted jianqiao123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单排序:直接插入排序相关的知识,希望对你有一定的参考价值。

直接插入排序(Straight Insertion Sort)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。

直接插入排序代码:

/*
 * 直接插入排序
 *
 * 参数说明:
 *     a -- 待排序的数组
 *     n -- 数组的长度
 */
void insert_sort(int a[], int n)

    int i, j, k;

    for (i = 1; i < n; i++)
    
        //为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置
        for (j = i - 1; j >= 0; j--)
            if (a[j] <= a[i])
                break;

        //如找到了一个合适的位置
        if (j != i - 1)
        
            //将比a[i]大的数据向后移
            int temp = a[i];
            for (k = i - 1; k > j; k--)
                a[k + 1] = a[k];
            //将a[i]放到正确位置上
            a[k + 1] = temp;
        
    

直接插入排序C实现:

#include <stdio.h>

// 数组长度
#define LENGTH(array) ( (sizeof(array)) / (sizeof(array[0])) )

/*
 * 直接插入排序
 *
 * 参数说明:
 *     a -- 待排序的数组
 *     n -- 数组的长度
 */
void insert_sort(int a[], int n)

    int i, j, k;

    for (i = 1; i < n; i++)
    
        //为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置
        for (j = i - 1; j >= 0; j--)
            if (a[j] < a[i])
                break;

        //如找到了一个合适的位置
        if (j != i - 1)
        
            //将比a[i]大的数据向后移
            int temp = a[i];
            for (k = i - 1; k > j; k--)
                a[k + 1] = a[k];
            //将a[i]放到正确位置上
            a[k + 1] = temp;
        
    


void main()

    int i;
    int a[] = 20,40,30,10,60,50;
    int ilen = LENGTH(a);

    printf("before sort:");
    for (i=0; i<ilen; i++)
        printf("%d ", a[i]);
    printf("\n");

    insert_sort(a, ilen);

    printf("after  sort:");
    for (i=0; i<ilen; i++)
        printf("%d ", a[i]);
    printf("\n");

直接插入排序Java实现:

import java.util.*;

public class InsertSort 
    private static int[] Sort(int[] arr) 
        int i, j;
        int insertNote = 0;// 要插入的数据
        int[] array = arr;
        // 从数组的第二个元素开始循环将数组中的元素插入
        for (i = 1; i < array.length; i++) 
            // 设置数组中的第2个元素为第一次循环要插入的数据
            insertNote = array[i];
            j = i - 1;
            // 比较关键元素与前一个,若成立后退一个位置
            // 在最幸运的那种情况当中,这个循环语句是不会执行的
            for (; j >= 0 && insertNote < array[j]; j--) 
                array[j + 1] = array[j];
            
            array[j + 1] = insertNote;
        
        System.out.println(Arrays.toString(array));
        return array;
    

    public static void main(String[] args) 
        Random random = new Random();
        int[] aa = new int[10];
        for (int i = 0; i < 10; i++) 
            aa[i] = Math.abs(random.nextInt() % 100);
        
        InsertSort.Sort(aa);
    

以上是关于简单排序:直接插入排序的主要内容,如果未能解决你的问题,请参考以下文章

插入排序(直接插入排序希尔排序);交换排序(冒泡排序快速排序);选择排序(简单选择排序堆排序);归并排序和基数排序;基于关键词比较的排序算法下界分析

八大基础排序中(直接插入排序,希尔排序,冒泡排序, 快速排序,归并排序,简单选择排序)

Go-插入排序

第三篇,插入排序算法:直接插入排序希尔排序

插入排序(直接插入排序折半插入排序希尔排序的算法思想及代码实现)

排序算法之插入排序(直接插入希尔排序)