//模板函数 对数组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);
}