排序算法——直接插入排序

Posted shujuxiong

tags:

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

C语言代码实现:

/*******************************************************
* Description: 直接插入排序算法
* Author: shujuxiong
* Version: 1.0
* Time: 2018-06-19
* Copyright:
*******************************************************/
#include<stdio.h>

//函数:打印数组
void PrintDataArray(int a[], int n)
{
    for(int i=0; i<n; i++)
        printf("%d, ",a[i]);
    printf("
");
}

//函数:交换数组元素
void  swap(int *x, int *y)
{
    int  temp;
    temp=*x;
    *x=*y;
    *y=temp;
}


//直接插入排序,版本1
void InsertSort1(int a[], int n)
{
    int i,j,k;
    for(i=1; i<n; i++)
    {
        //找到要插入的位置
        for(j=0; j<i; j++)
        {
            if(a[j]<a[i])
                continue;

            //插入并后移剩余元素,后移元素的操作类似于冒泡排序
            if(i != j)
            {
                int temp=a[i];
                for(k = i-1; k>=j; k--)
                    a[k+1] = a[k];
                a[j] = temp;
            }
        }
    }
    PrintDataArray(a, n);
}


//直接插入排序,版本2,搜索和后移同时进行
void InsertSort2(int a[], int n)
{
    int i,j,k;
    for(i=1; i<n; i++)
    {
        if(a[i]<a[i-1])
        {
            //插入并后移剩余元素
            int temp = a[i];
            for(j=i-1; j>=0 && a[j]>temp; j--)
            {
                a[j+1] = a[j];
            }
            a[j+1] = temp;
        }
    }
    PrintDataArray(a, n);
}


//插入排序,版本3:用数据交换代替版本2的数据后移(比较对象只考虑两个元素),像冒泡排序?
//算法4中使用该方法
void InsertSort3(int a[], int n)
{
    for(int i=1; i<n; i++)
        for(int j=i-1; j>=0 && a[j+1]<a[j];j--)
        {
            swap(&a[j+1], &a[j]);
        }
    PrintDataArray(a, n);
}

//测试用例
int main()
{
    int a[] = {3,1,7,5,2,4,9,6};
    int len = sizeof(a)/sizeof(a[0]);
    InsertSort1(a, len);
    InsertSort2(a, len);
    InsertSort3(a, len);
    return 0;
}

运行结果:

技术分享图片

 

Python 代码实现:

#!/usr/bin/python
# -*- coding: utf-8 -*-


##直接插入排序,版本1,最简单方式
def insertSort1(relist):
    len_ = len(relist)
    for i in range(1,len_):  
        for j in range(i):
            if relist[i] < relist[j]:
                relist.insert(j,relist[i])  # 首先碰到第一个比自己大的数字,赶紧刹车,停在那,所以选择insert
                relist.pop(i+1)  # 因为前面的insert操作,所以后面位数+1,这个位置的数已经insert到前面去了,所以pop弹出
                break
    return relist

	
##直接插入排序,版本2
def InsertSort2(myList):    
    length = len(myList)

    for i in range(1,length):        
        j = i - 1
        
        #如果当前值小于前一个元素,则将当前值作为一个临时变量存储,将前一个元素后移一位
        if(myList[i] < myList[j]):
            temp = myList[i]
            myList[i] = myList[j]
            
            #继续往前寻找,如果有比临时变量大的数字,则后移一位,直到找到比临时变量小的元素或者达到列表第一个元素
            j = j-1
            while j>=0 and myList[j] > temp:
                myList[j+1] = myList[j]
                j = j-1

            #将临时变量赋值给合适位置
            myList[j+1] = temp


#测试用例
def main():
    myList = [49,38,65,97,76,13,27,49]
    sortedlist=insertSort1(myList)
    print(sortedlist)


if __name__ == ‘__main__‘:
	main()

运行结果:

技术分享图片

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

排序算法学习(直接插入排序,希尔排序,选择排序,堆排序,冒泡排序)

七大排序算法

排序算法 直接插入排序及改进

直接插入排序算法——Java实现

排序算法-直接插入排序

排序算法——直接插入排序