c++模板排序函数

2 篇文章 0 订阅
//模板函数 对数组arr进行选择排序
//选择排序
template <typename T>
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<typename T>
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<typename T>
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<typename T>
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 <backlong ; i++ )
		backArray[i] = arr[midposition + 1 + i];//后段数组从中间坐标的下一个开始//
	//从两个新数组中挑选最小的数放入arr数组中 直到两数组全挑完
	int fp,bp,ap;
	for (fp = 0,bp = 0,ap = startposition;fp < frontlong && bp < backlong;)
	{
		if (frontArray[fp] <= backArray[bp])
			arr[ap++] = frontArray[fp++];
		else
			arr[ap++] = backArray[bp++];
	}
	if (bp == backlong)
		while(fp < frontlong)
			arr[ap++] = frontArray[fp++];
	else if(fp == frontlong)
		while(bp < backlong)
			arr[ap++] = backArray[bp++];
	delete[] frontArray;
	delete[] backArray;
}
//归并排序  传入第一个和最后一个数的下标
template<typename T>
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<typename T>
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);

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值