基于C++语言实现的几种常用的排序方法小结(一)

前几天,面试时有被问到一些常见的排序算法,快速排序命中率很高,现整理一些常见的排序算法模板:

#include<iostream>
using namespace std;

template <class T>
void Swap(T *a, T *b) 
{
	T temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

/**************************************** 简单排序算法 begin ****************************************/

/*
 * 简单选择排序
 * A: 以数组存放的无数数
 * n: 数组A中从位置0到n排序(从小到大)
 */
template <class T>
void SelectSort(T A[], int n)
{
	int small;
	for( int i = 0; i < n - 1; i++) {			// 执行 n-1 趟
		small = i;								// 先假定待排序序列中第一个元素最小
		for( int j = i + 1; j < n; j++ ) {		// 每趟扫描待排序序列n-i-1次
			if( A[j] < A[small] ) {				// 如果扫描到一个比最小值元素还小的,则记下其下标
				small = j;		
			}
		}
		Swap(&A[i],&A[small]);					// 最小元素与待排序序列中第一个元素交换
	}
}

/*
 * 直接插入排序
 * A: 以数组存放的无数数
 * n: 数组A中从位置0到n排序(从小到大)
 */
template <class T>
void InsertSort(T A[], int n)
{
	for(int i = 1; i < n; i++) {				// 执行 n-1 趟
		int j = i;
		T temp = A[i];							// 待插入元素存入临时变量
		while(j > 0 && temp < A[j-1]) {			// 从后往前查找插入位置
			A[j] = A[j-1];						// A[j-1]元素后移
			j--;								// j指针前移
		}
		A[j] = temp;							// 待插入元素存入找到的插入位置
	}
}

/*
 * 冒泡排序
 * A: 以数组存放的无数数
 * n: 数组A中从位置0到n排序(从小到大)
 */
template <class T>
void BubbleSort(T A[], int n)
{
	int i,j,last;
	i = n - 1;
	while ( i > 0 ) {							// 最多进行n-1躺
		last = 0;								// 将last赋值为0
		for( j = 0; j < i; j++) {				// 从前往后进行相邻元素的两两比较
			if(A[j+1] < A[j]) {
				Swap(&A[j],&A[j+1]);				// 后者小,则交换
				last = j;						// 有交换,last置为j
			}
		}
		i = last;								//如果一趟没有元素交换,则last为0
	}
}

/**************************************** 简单排序算法 end ****************************************/

/**************************************** 快速排序 begin ****************************************/

/*
 * 快速排序
 * A: 以数组存放的无数数
 * left和right: A[left] 和 A[right] 之间的元素排序
 */
template <class T>
void QuickSort(T A[], int left, int right)
{
	int i,j;
	if(left < right) {							// 若待排序序列多于一个元素,则继续快速排序
		i = left;								// 游动指针i,j
		j = right + 1;
		Swap(&A[left],&A[(left + right)/2]);	// 避免最坏境况发生
		do {									// 开始一趟快速排序,A[left]做为分割元素
			do i++; while(A[i] < A[left]);		// i指针从左往右找第一个 大于等于 分割元素的元素
			do j--; while(A[j] > A[left]);		// j指针从右往左找第一个 小于等于 分割元素的元素
			if( i < j ) Swap(&A[i],&A[j]);		// 若 i < j,则交换两个元素
		} while(i<j);							// 若 i < j,则继续本趟排序
		Swap(&A[left],&A[j]);					// 交换分割元素A[left]和A[j]的位置
		QuickSort(A,left,j-1);					// 对低端序列快速排序
		QuickSort(A,j+1,right);					// 对高端序列快速排序
	}
}

/**************************************** 快速排序 end ****************************************/

/*对上面的几种排序算法,进行简单的测试*/
int main() {
	int a[5] = {2,1,6,8,3};
//	SelectSort(a,5);
//	InsertSort(a,5);
//	BubbleSort(a,5);

	QuickSort(a,0,4);
	for(int i = 0; i < 5; i++) {
		cout << a[i] << " ";
	}
	cout << endl;
	return 0;
}

原文地址:https://www.cnblogs.com/matrix77/p/2194503.html