快速排序、归并排序、插入排序的c++实现
1.注释中的解释非常详细,建议直接复制代码到编译器中查看
2.头文件使用的是函数模板,可适用于各种数据类型的排序
头文件如下:
#pragma once
template <class E>
void swap(E a[], int i, int j)
{
E tem = a[i];
a[i] = a[j];
a[j] = tem;
}
template <class E>
void insertionSort(E A[], int n)
{
for (int i = 1; i < n; i++)
{
for (int j = i; j >0; j--)
{
if (A[j] <A[j - 1])
swap(A, j - 1, j);
else
break;
}
}
}
template<class E>
void inssort(E A[], int n)
{
for (int i = 1; i < n; i++)
{
for (int j = i; (j > 0) && (A[j] < A[j - 1]); j--)
swap(A, j - 1, j);
}
}
template<class E>
void Bmergesort(E A[],E temp[],int left,int right)
{
if (left == right)
return;
int mid = left + (right - left) / 2;
Bmergesort(A, temp, left, mid);
Bmergesort(A, temp, mid+1, right);
for (int i = left; i <= right; i++)
temp[i] = A[i];
int i1 = left;
int i2 = mid + 1;
for (int curr = left; curr <= right; curr++)
{
if (i1==mid+1)
{
A[curr] = temp[i2++];
}
else if(i2==right+1)
{
A[curr] = temp[i1++];
}
else if(temp[i1]<=temp[i2])
{
A[curr] = temp[i1++];
}
else
{
A[curr] = temp[i2++];
}
}
}
template<class E>
void mergesort(E A[], E temp[], int left, int right)
{
if (right - left <= 3)
{
insertionSort(&A[left], right - left + 1);
return;
}
int mid = left + (right - left) / 2;
mergesort(A, temp, left, mid);
mergesort(A, temp, mid + 1, right);
int i, j, k;
for (i = mid; i >= left; i--)
temp[i]=A[i];
for (j = mid + 1; j <= right; j++)
temp[right + mid + 1 - j]=A[j];
for (i = left, j = right, k = left; k <= right; k++)
{
if (temp[i] <=temp[j])
A[k] = temp[i++];
else
A[k] = temp[j--];
}
}
template<class E>
inline int partition(E A[], int l, int r, E& pivot)
{
do
{
while ((l<=r)&&(A[l] <= pivot))
l++;
while ((l<=r)&&(A[r] >= pivot))
r--;
if(l<r)
swap<E>(A, l, r);
} while (l <= r);
return l;
}
template<class E>
inline int findpivot(E A[],int i,int j)
{
return (i + j) / 2;
}
template<class E>
void Qsort(E A[], int i, int j)
{
if (j <= i) return;
int pivotindex = findpivot(A, i, j);
swap<E>(A, pivotindex, j);
int k = partition<E>(A, i, j - 1, A[j]);
swap<E>(A, k, j);
Qsort<E>(A, i, k - 1);
Qsort<E>(A, k+1, j);
}
template<class E>
inline int Partition(E A[], int l, int r, E& pivot)
{
do
{
while ((l < r) && A[++l] <= pivot);
while ((l < r) && pivot <= A[--r]);
if(l<r)
swap<E>(A, l, r);
} while (l < r);
return l;
}
template<class E>
void QQsort(E A[], int i, int j)
{
if (j <= i) return;
int pivotindex = findpivot<E>(A, i, j);
swap<E>(A, pivotindex, j);
int k = Partition<E>(A, i - 1, j, A[j]);
swap<E>(A, k, j);
QQsort<E>(A, i, k - 1);
QQsort<E>(A, k + 1, j);
}
测试程序:
#include <iostream>
using namespace std;
#include"sort.h"
#ifdef S1
int main()
{
int a[6] = { 9,8,7,6,5,4 };
insertionSort<int>(a, 6);
for (int i = 0; i < 6; i++)
cout << a[i] << " ";
cout << endl;
int b[6] = { 9,8,7,6,5,4 };
inssort(b, 6);
for (int i = 0; i < 6; i++)
cout << b[i] << " ";
}
#endif
#ifdef S2
int main()
{
int a[6] = { 9,8,7,6,5,4 };
int tem[6] = { 0 };
mergesort<int>(a, tem, 0, 5);
for (int m = 0; m < 6; m++)
cout << a[m] << " ";
cout << endl;
int b[6]={ 9,8,7,6,5,4 };
Bmergesort<int>(b, tem, 0, 5);
for (int m = 0; m < 6; m++)
cout << b[m] << " ";
}
#endif
int main()
{
int a[6] = { 9,8,7,6,5,4 };
Qsort<int>(a, 0, 5);
for (int i = 0; i < 6; i++)
cout << a[i] << " ";
cout << endl;
int b[6] = { 1,2,6,4,5,3 };
Qsort<int>(b, 0, 5);
for (int i = 0; i < 6; i++)
cout << b[i] << " ";
cout << endl;
int c[6] = { 1,3,5,2,7,4 };
QQsort<int>(c, 0, 5);
for (int i = 0; i < 6; i++)
cout << c[i] << " ";
cout << endl;
int d[6] = { 1,2,6,4,5,3 };
QQsort<int>(d, 0, 5);
for (int i = 0; i < 6; i++)
cout << d[i] << " ";
cout << endl;
}