前几天,面试时有被问到一些常见的排序算法,快速排序命中率很高,现整理一些常见的排序算法模板:
#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; }