讲道理,快速排序不是应该比希尔排序更快吗?

但是我写的代码测试出来确实希尔排序比快速排序快得多,这是为什么呢?而且没对快速排序优化之前,两次递归,很容易栈溢出,崩溃

这是为什么呢?上代码:

//希尔排序
template
void ShellSort(T* pArr ,int nLength)
{
	//设置增量,做插入排序,分组有序,最后全部有序
	int i,j,nIncrement=nLength;
	do 
	{
		//分组
		nIncrement =nIncrement/2;
		for (i =nIncrement;i=0&&pArr[j]>temp;j-=nIncrement)
					pArr[j+nIncrement] = pArr[j];
				pArr[j+nIncrement] = temp;
			}
		}
	} while (nIncrement>1);
}

//快速排序
template
void QSort(T* pArr,int nStart,int nEnd)
{
	while (nStart < nEnd)
	{
		//初始化第一个为枢轴值
		int mid =(nStart+nEnd)/2;
		T nPivotkey, temp ;
		//三数取中值为枢轴值
		if((pArr[nStart]>pArr[mid]&&pArr[nStart]pArr[nEnd]&&pArr[nStart]pArr[mid]&&pArr[nStart]>pArr[nEnd]) || 
			(pArr[nStart]pArr[nEnd]))
			mid =nStart;
			
		//保存枢轴值
		nPivotkey=pArr[mid];
		int nPivot = nStart;
		int nTempEnd=nEnd;
		//一轮交换确定枢轴值位置
		while(nPivot =nPivot;i--)
				pArr[i+1]=pArr[i];
			pArr[nPivot] = temp;
			//大的到后面
			while(nPivot < nTempEnd && !(pArr[nPivot] > nPivotkey))
				nPivot++;
			temp = pArr[nPivot];
			for (int i=nPivot+1;i<=nTempEnd;i++)
				pArr[i-1]=pArr[i];
			pArr[nTempEnd] = temp;
		}
		//递归调用
		QSort(pArr,nStart,nPivot);
		//尾递归
		nStart =nPivot+1;

	}
}
template
void QuickSort(T* pArr,int nLength)
{
	QSort(pArr,0,nLength-1);
}
100个简单数据,完全逆序的排序时间

1000个简单数据,完全逆序的排序时间


5000个简单数据,完全逆序的排序时间


10000个简单数据,完全逆序的排序时间


10万个简单数据,完全逆序的排序时间

这样看起来快速排序似乎并不快啊,是不是我哪里写错了??


你可能感兴趣的:(经验之谈)