插入排序——直接插入排序、二分插入排序、希尔排序

选择排序是一种较为简单的排序算法。它的实现原理是每一次从待排序的数据元素中挑出一个最小(大)的元素,存放在数据的起始(末尾)位置,直到所有待排序的数据排完。

直接插入排序:

当插入第i个元素的时候,我们认为它前面的i个元素已序。

这时候用array[i]的排序吗与前面的排序码进行比较,找到适合的位置就进行插入,原来位置上的元素按顺序向后移动。

 

 

时间复杂度:     最差:和所需要的序列相反 O(n^2)

                         最优:和所需要的系列相同 O(n)

空间复杂度:O(1)

稳定性:不稳定

代码如下:

void InsertSort(int *array, int size)
{
	for (int i = 0; i<size; i++)
	{
		int key = array[i];
		int end = i-1;
		while (end >= 0 && key < array[end])   // key <= array[end]不稳定
		{
			array[end+1] = array[end];
			end--;
		}
		array[end+1] = key;
	}
}

二分插入排序:

在插入排序中,如果比较操作的代价大于数据交换的代价时,这时候二分查找的作用就很明显了。通过二分查找,我们可以减少比较操作的次数。

时间复杂度:   最差:O(N^2)

                       最优:n O(lgN)

空间复杂度:O(1)

稳定性:稳定

void binarysort(int *array, int size)
{
	for (int i = 0; i < size; i++)
	{
		int left = array[0];
		int right = array[size - 1];
		int mid = 0;
		int key = array[i];
		while (left< right)
		{
			mid = left + (left + right) / 2;
			if (key > array[mid])
				left = mid+1;
			else
				right = mid+1;
		}
		for (int j = i - i; i >= left; j--)
		{
			array[j+1] = array[j];
			array[left] = key;
		}
	}
}

当数据量较多的时候,二分插入排序可以很大程度上的减少数据的比较次数。但是当数据接近有序时,直接插入排序就要优于二分插入排序。

希尔排序:

希尔排序又叫“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。把所有数据按照一定的增量分组,分别对每组使用直接插入排序,随着增量的减少,每组包含的关键词越来越多。增量减为1时,排序结束。

希尔排序较之直接插入排序效率高在:直接插入排序每次只能移动一个数据,而希尔排序每次可以移动增量数个数据。排序的时间复杂度大幅度提高。

void shellsort(int *array, int size)
{
 int  gap = size;
 while (gap>1)
   {
    for (int i = 0; i<=size; i++)
     {
      gap = gap / 3 + 1;
      int key = array[i];
      int end = i + gap;
      while (end <= size-1 && key > array[end])
       {
         swap(key, array[end]);
         end = end + gap;
       }
      break;
     }
   }
}




 

猜你喜欢

转载自blog.csdn.net/weixin_36229332/article/details/79155195