算法基础-直接插入排序

一、直接插入排序

基本思想:每次将一个待排序的序列的一个元素,插入到已经排好序的序列中。如待排序列A={1,-1,3,4},假设我们希望序列是从下到大排列的,

那么,首先将序列A分解为A1={1}和A2={-1,3,4},其中A1作为排好的序列,这样一来,首先从A2中取第一个元素-1,与A1中的1比较,按从下到大顺序把-1放入A1中,A2的其他元素以此类推,依次放入A1中,这样就得到了一个有序的序列了。下面的算法实现一就是直接插入排序的直译。

空间复杂度分析:

时间复杂度分析:

(1) 如何待排序的序列是非递减的,比较次数为n-1;如果排序前是非递增顺序,比较次数为:3+4,+...+(n+1)

这样看来,时间复杂度为O(n^2),平均后仍然是O(n^2)


下面使用了3中方法实现了。

二、算法实现

// 直接插入排序.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


#include <iostream>

using namespace std;

void InsertSort1(int a[],int n);
void InsertSort2(int a[],int n);
void InsertSort3(int a[],int n);
void Swap(int *x1, int *x2);


int _tmain(int argc, _TCHAR* argv[])
{
	int Array[4]={1,-1,3,4};
	for ( int i=0; i< 4; i++)
		cout << Array[i] << " ";
	cout << endl;
	
	InsertSort1(Array,4);
	//InsertSort2(Array,4);
	//InsertSort3(Array,4);

	for ( int i=0; i< 4; i++)
		cout << Array[i] << " ";
	cout << endl;

	return 0;
}

//直接插入排序1
void InsertSort1(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;  
        }  
    } 
}

//直接插入排序2
void InsertSort2(int a[],int n)
{
	int i, j;
	for ( i = 1; i < n; i++)
		if ( a[i] < a[i - 1]) //a[i] >= a[i-1]表示a[0...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;
		}
}

//直接插入排序3
void InsertSort3(int a[], int n)
{
	int i, j;
	for ( i = 1; i < n; i++)
		for (j = i - 1; j >= 0 && a[j] > a[j + 1]; j--)
			Swap((a+j),(a+j+1));
}

void Swap(int *x1, int *x2)
{
	int temp;
	temp = *x1;	
	*x1 = *x2;
	*x2 = temp;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值