排序-插入排序

    插入排序的思想:插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

算法描述:

    一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

  • 从第一个元素开始,该元素可以认为已经被排序;
  • 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  • 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  • 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  • 将新元素插入到该位置后;
  • 重复步骤2~5。

算法的时间复杂度

    插入排序的时间复杂度分析。在最坏情况下,数组完全逆序,插入第2个元素时要考察前1个元素,插入第3个元素时,要考虑前2个元素,……,插入第N个元素,要考虑前 N - 1 个元素。因此,最坏情况下的比较次数是 1 + 2 + 3 + ... + (N - 1),等差数列求和,结果为 N^2 / 2,所以最坏情况下的复杂度为 O(N^2)

    最好情况下,数组已经是有序的,每插入一个元素,只需要考查前一个元素,因此最好情况下,插入排序的时间复杂度为O(N)

实现代码:

#include <iostream>
using namespace std;


void insertionSort(int arr[], int len)
{

	if(arr == NULL || len == 1 )
		return ;

	for(int i = 1; i != len; ++i)				// 待插入元素
	{
		int current = arr[i];
		int j = i - 1;
		while( j != -1 && current < arr[j])		// 有序元素
		{
			arr[j+1] = arr[j];			
			--j;
		}
		arr[j + 1] = current;

	}
}

int main()
{

	int arr[10] = {1,4,5,18,20,3,5,77,10,2};
	insertionSort(arr, 10);

	for(int i = 0; i != 10; i++ )
		cout << arr[i] << " ";
	cout << endl;

	return 0;
}

运行结果

1 2 3 4 5 5 10 18 20 77


猜你喜欢

转载自blog.csdn.net/snailcpp/article/details/79982701