排序是算法和数据结构理论中的经典问题。用C++函数模板实现了数组插入排序、归并排序和快速排序的函数,可以存为头文件以便学习使用。
#pragma once
#include <limits>
using namespace std;
namespace IntroAlgo3
{
template <typename T>
void InsertSort(T *, int);//插入排序
template <typename T>
void Merge(T *, int, int, int);
template <typename T>
void _mergesort(T *, int, int);
template <typename T>//归并排序
void MergeSort(T *, int);
template <typename T>
void _quicksort(T *, T*);
template <typename T>
void QuickSort(T *, int);//快速排序
//插入排序函数模板
template<typename T>
void InsertSort(T *A, int len)
{
T key;
for (int j = 1; j < len; ++j)
{
key = A[j];
int i = j - 1;
while (i >= 0 && A[i] > key)
{
A[i + 1] = A[i];
i--;
}
A[i + 1] = key;
}
}
//归并排序函数模板
template<typename T>
void MergeSort(T *A, int len)
{
_mergesort(A, 0, len - 1);
}
template <typename T>
void _mergesort(T *A, int p, int r)
{
if (p < r) {
int q = (p + r) / 2;//将数组分为两部分,分别递归调用
_mergesort(A, p, q);
_mergesort(A, q + 1, r);
Merge(A, p, q, r);
}
}
template<typename T>
void Merge(T * A, int p, int q, int r)
{
int n1 = q - p + 1;
int n2 = r - q;
T *cursor = A + p;
T *L = new T[n1 + 1];
T *R = new T[n2 + 1];
for (int i = p; i <=r; ++i) {
((i-p) < n1) ? L[i-p] = A[i] : R[i-p - n1] = A[i];
}
L[n1]= numeric_limits<T>::max();
R[n2]= numeric_limits<T>::max();//最后一个元素赋最大值
while (cursor < (A + r + 1))
*cursor++ = *((*L < *R) ? L++ : R++);//在L和R中扫描并将最小的一个元素赋予A
}
}
//快速排序函数模板
template<typename T>
void QuickSort(T *A, int len)
{
_quicksort(A, A + len - 1);
}
template<typename T>
void _quicksort(T * A1, T * A2)
{
if (A1 < A2) {
T elem = *A1;
T *low = A1;
T *high = A2 + 1;
for (;;) {
while (*++low < elem&&low < A2);
while (elem < *--high && high > A1);
if (low < high)
swap(*low, *high);
else
break;
}
swap(*A1, *high);
_quicksort(A1, high - 1);
_quicksort(high + 1, A2);
}
}
}
调用方法:
#include <iostream>
#include "sortmpl.h"
#define LENGTH_ARR 8
using namespace std;
using namespace IntroAlgo3;
int main() {
int arr[LENGTH_ARR] = {15,6,17,85,29,50,16,45};
double arr1[LENGTH_ARR];
double dmax = RAND_MAX + 1.0;
for (int i = 0; i < LENGTH_ARR; ++i)
{
arr1[i] = rand()/dmax;
}
MergeSort(arr, LENGTH_ARR);
QuickSort(arr1, LENGTH_ARR);
for (int i = 0; i < LENGTH_ARR; i++)
{
cout << arr[i] << ",";
}
cout << endl;
for (int i = 0; i < LENGTH_ARR; i++)
{
cout << arr1[i] << ",";
}
cout << endl;
cin.get();
}
运行结果:
6,15,16,17,29,45,50,85,
0.00125122,0.193298,0.350281,0.479858,0.563568,0.584991,0.808716,0.895935,