码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-06-20 00:55:17      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:main   测试   ret   continue   pytho   python   ++   ima   临时   

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("\n");
}

//函数:交换数组元素
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()

运行结果:

技术分享图片

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

标签:main   测试   ret   continue   pytho   python   ++   ima   临时   

原文地址:https://www.cnblogs.com/shujuxiong/p/9201748.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!