bool insertSort(int *array,int length,int increment)
{
	if (!array || length < 1 || increment < 0)
	{
		return false;
	}

	for (int i = increment;i < length;i += increment)
	{
		for (int j = i;j >= increment && array[j] < array[j - increment];j -= increment)
		{
			swap(array[j],array[j - increment]);
		}
	}
}

bool shellSort(int *array,int length)
{
	if (!array || length < 1)
	{
		return false;
	}

	for (int gep = length / 2;gep > 0;gep /= 2)
	{
		insertSort(array,length,gep);
	}

	return true;
}

void test1()
{
	int array[] = {1,3,5,7,9,2,4,6,8,0};
	const int size = sizeof(array) / sizeof(array[0]);

	if(shellSort(array,10))
		copy(array,array+size,ostream_iterator<int>(cout," "));

	cout<<endl;
}


int _tmain(int argc, _TCHAR* argv[])
{
	test1();
	return 0;
}

 

为什么希尔排序的时间性能优于直接插入排序

用插入法分别对几组数据后,整个数组已有一定的有序程度
后几次排序的比较次数就会少一点
二分(折半)插入(Binary insert sort)排序基本思想:设在数据表中有一个元素序列v[0],v[1],v[2]......v[n].其中v[0],v[1],v[2]......v[i-1]是已经排好序的元素。在插入v[i]。利用折半搜索寻找v[i]的插入位置。

二分插入排序是一种稳定的排序。当n较大时,总排序码比较次数比直接插入排序的最差情况好得多,但比最好情况要差,所元素初始序列已经按排序码接近有序时,直接插入排序比二分插入排序比较次数少。二分插入排序元素移动次数与直接插入排序相同,依赖于元素初始序列。

参考代码:

template <class T>
void Sort<T>::binaryInsert(DataList<T> &datalist, int n)
{
  if (-1 == n)
  {
    for (int i = 1; i < datalist.m_nCurrentSize; i++)
    {
      binaryInsert(datalist, i);
    }
    return;
  }
  Element<T> temp = datalist.m_pvector[n];
  int left = 0, right = n - 1;  
  while(left <= right)
  {
    int middle = (left + right) / 2;
    if (temp > datalist.m_pvector[middle])
    {
      left = middle + 1;
    }else
    {
      right = middle - 1;
    }
  }
  for (int j = n - 1; j >= left; j--)
  {
    datalist.m_pvector[j+1] = datalist.m_pvector[j];
  }
  datalist.m_pvector[left] = temp;
}

 总结:以上三种排序方法的核心都是直接插入排序,直接插入排序对于大部分有序的序列排序时速度快。二分插入排序在直接插入的基本上改变了查找元素插入位置 的方法,对于完全无序的序列来说,速度会变快,但是对开大部分有序的序列反而会更慢,希尔排序则利用直接插入排序对于大部分有序的序列速度快的特点,先让 大部分序列有序,以此来提高排序效率。

posted on 2014-11-30 22:12  风云逸  阅读(38)  评论(0)    收藏  举报