一、直接插入排序
基本思想:每次将一个待排序的序列的一个元素,插入到已经排好序的序列中。如待排序列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;
}

4216

被折叠的 条评论
为什么被折叠?



