c++模板排序函数

//模板函数 对数组arr进行选择排序
//选择排序
template 
void selsectionSort( T arr[] , int n)
{
	for (int i = 0 ; i < n ; i++ )
	{
		int minIndex = i;
		for ( int j = i + 1 ; j < n ; j ++)
			if ( arr[j] < arr[minIndex] )
				minIndex = j;
		
		swap( arr[i] , arr[minIndex]);
	}
}

//插入排序(改进)
template
void insertionSort(T arr[] , int n)
{
	for ( int i = 1 ; i < n ; i ++)
	{
		T e = arr[i];
		int j;
		for ( j = i ; j > 0 && arr[j-1] > e ; j -- )
			arr[j] = arr[j-1];
		arr[j] = e;
	}
}

//冒泡排序改进(已经排好序的只比较一遍)
template
void bubberSort(T arr[] , int n)
{
	int len = n;
	int flag = len;
	while(flag > 0)//flag就是要排序的范围,已经有序的就要去掉
	{
		flag = 0;
		for ( int i = 1; i < len ; i ++)
			if (arr[i-1] > arr[i])
			{
				swap(arr[i-1],arr[i]);
				flag = i;
			}
			len = flag;
	}

}

//归并 传入第一个 中间 最后一个数下标
template
void mymerge(T arr[] , int startposition , int midposition , int endposition)
{
	//将前半数组和后半数组分别放入两个新数组中
	int frontlong = midposition - startposition + 1;
	int backlong = endposition - midposition ;//
	T *frontArray = new T[frontlong];
	T *backArray = new T[backlong];
	for(int i = 0 ; i < frontlong ; i ++)
		frontArray[i] = arr[startposition + i];
	for (int i = 0 ; i 
void mergeSort(T arr[] , int startposition , int endposition)
{
	if(startposition  < endposition)//if不是while//不+1//递归的终结条件:子区间长度为1
	{
		int midposition = (endposition + startposition)/2;//相加除2
		mergeSort(arr , startposition , midposition);
		mergeSort(arr , midposition +1 , endposition);
		if (arr[midposition] <= arr[midposition+1])
			return;
		mymerge(arr,startposition,midposition,endposition);
		//判断测试数组是否已经有序,如果 arr[mid] <= arr[mid+1],我们就认为数组已经是有序的并跳过merge() 方法
		//,可以是任意有序的子数组算法的运行时间变为线性的。
	} 
}

//快速排序 传入第一个和最后一个数的下标
template
void quickSort(T arr[] , int startposition , int endposition)
{
	//快速排序之前先判断一下当前待排序数组元素个数是不是大于1 否则就没有必要排序
	if (startposition >= endposition)
	{
		//直接退出排序代码  没有必要进行排序了
		return; 
	}
	T temp = arr[startposition];
	int leftIndex = startposition;
	int rightIndex = endposition;
	while(leftIndex < rightIndex)
	{
		//从右边开始找比temp小的数,放入leftIndex位置
		while(leftIndex < rightIndex)
		{
			if (arr[rightIndex] >= temp)
				rightIndex--;
			else
			{
				arr[leftIndex] = arr[rightIndex];
				leftIndex++;
				break;//没写break 导致堆栈溢出
			}
		}
		//然后从左边开始找比temp大的数,放入rightIndex位置
		while(leftIndex < rightIndex)
		{
			if (arr[leftIndex] <= temp)
				leftIndex++;
			else
			{
				arr[rightIndex] = arr[leftIndex];
				rightIndex--;
				break;//没写break 导致堆栈溢出
			}
		}
	}
	//最后leftIndex等于rightIndex时,左右边都是比temp小大的数了,把temp放入left位置,结束这一轮
	arr[leftIndex] = temp;
	quickSort(arr,startposition,leftIndex-1);
	quickSort(arr,leftIndex+1,endposition);

}

 

你可能感兴趣的:(c++,算法)