【C++】自己的快速排序与二分插入排序的封装
来源:互联网 发布:美橙互联域名管理 编辑:程序博客网 时间:2024/06/05 11:13
//MySort.h
#include <stdlib.h>#ifndef MYSORT_H_INCLUDED#define MYSORT_H_INCLUDED/*函数声明 设置默认参数*/template <class T>int QuickSort_ChooseBaseNumber_First(T a[], int left, int right);template <class T>int QuickSort_ChooseBaseNumber_Middle(T a[], int left, int right);template <class T>int QuickSort_ChooseBaseNumber_Rand(T a[], int left, int right);template <class T>int QuickSort_ChooseBaseNumber_Ballance(T a[], int left, int right);template <class T>bool cmp_default(T& a, T& b);//默认比较函数,规定其返回值使得排序从小到大template <class T>void InsertionSort(T a[], int size,bool (*cmp)(T&, T&) = cmp_default);template <class T>void QuickSort(T a[], int left, int right, bool (*cmp)(T&, T&) = cmp_default, int (*getbase)(T[], int, int) = QuickSort_ChooseBaseNumber_Middle);/*函数声明 设置默认参数*/template <class T>bool cmp_default(T& a, T& b)//默认比较函数,规定其返回值使得排序从小到大{ return a < b;//若为结构体或类对象,需要重载运算符或者比较直接用其成员}template <class T>void InsertionSort(T a[], int size,bool (*cmp)(T&, T&))//二分插入排序,cmp为比较函数指针,默认为cmp_default从小到大{ T temp; int left, right, mid; for(int i = 0; i < size; ++i) { temp = a[i]; left = 0; right = i - 1; while(left <= right) { mid = (left + right) >> 1; if( cmp(temp, a[mid]) ) right = mid - 1; else left = mid + 1; } for(int j = i - 1; j >= left; --j) a[j + 1] = a[j]; a[left] = temp; }}/*下面快速排序*//*快排,找个基准数,把集合分成两块,左边全部比基准数小,右边全部大*/template <class T>void QuickSort(T a[], int left, int right, bool (*cmp)(T&, T&), int (*getbase)(T[], int, int)){ if(left >= right) return; int l = left, r = right; /*选取基准数开始*/ int base_index = getbase(a, left, right); swap(a[left], a[base_index]);//和第一个交换 T base = a[l]; /*选取基准数结束*/ while(l < r)//开始以基准数为中进行左右分堆 { while(!cmp(a[r], base) && l < r) --r; if(l < r) a[l++] = a[r]; while(cmp(a[l], base) && l < r) ++l; if(l < r) a[r--] = a[l]; } a[l] = base; int pos = l; QuickSort(a, left, pos - 1, cmp);//递归左边 QuickSort(a, pos + 1, right, cmp);//递归右边}/*下面为选取基准数的几种方法*/template <class T>int QuickSort_ChooseBaseNumber_First(T a[], int left, int right)//选取基准数{ return left; /*选取第一个数*/}template <class T>int QuickSort_ChooseBaseNumber_Middle(T a[], int left, int right)//选取基准数{ return (left + right) / 2; /*选取中间*/}template <class T>int QuickSort_ChooseBaseNumber_Rand(T a[], int left, int right)//选取基准数{ return (rand() % (right - left) + left); /*选取随机数作为基准*/ //使用时尽量在最外调用处初始随机数种子 //不能在这里初始,因为调用时间间隔太小}template <class T>int QuickSort_ChooseBaseNumber_Ballance(T a[], int left, int right)//选取基准数{ /*平衡快排选取*/ if(right - left < 3) return left;//如果不足3个返回第一个 int mid = (left + right) / 2; if(a[left] > a[mid]) swap(a[left], a[mid]); if(a[mid] > a[right]) swap(a[mid], a[right]); if(a[left] > a[mid]) swap(a[left], a[mid]); return mid;}#endif // MYSORT_H_INCLUDED
//main.cpp
#include <iostream>#include <string>#include <cstdlib>#include <conio.h>#include "MySort.h"using namespace std;int menu();//菜单int input(string* str);void output(string* str, int n);void s1(string *str);//二分插入排序void s2(string *str);//快速排序bool cmpcmp(string &a,string &b) //从大到小的比较函数{ return a > b;}int main(){ system("color 0A"); string str[10000]; while(1) { system("cls"); int n = menu(); while(n < 1 || n > 3) { system("cls"); cout << "输入错误,请重新输入!" << endl; n = menu(); } switch(n) { case 1:s1(str);break; case 2:s2(str);break; case 3:exit(0);break; default:break; } } return 0;}int input(string* str){ int n; cout << "请输出测试数据量n :" << endl; cin >> n; cout << "请输入" << n << "个字符串,空格或换行隔开:" << endl; for(int i = 0; i < n; ++i) cin >> str[i]; return n;}void output(string* str, int n){ for(int i = 0; i < n; ++i) cout << str[i] << ' '; cout << endl;}int menu()//菜单{ cout << "\t\t*******************************************" << endl << "\t\t* *" << endl << "\t\t* 1.插入排序 *" << endl << "\t\t* 2.快速排序 *" << endl << "\t\t* 3.退出 *" << endl << "\t\t* *" << endl << "\t\t* 请按数字键进行选择 *" << endl << "\t\t*******************************************" << endl; char ch = getch(); return (int)ch - '0';}void s1(string *str)//二分插入排序{ system("cls"); cout << "\t\t二分插入排序\t\t" << endl; int n = input(str); cout << "从小到大排序好后:" <<endl; InsertionSort(str, n); output(str, n); cout <<"再从大到小排:" << endl; InsertionSort(str, n, cmpcmp); output(str, n); system("pause");}void s2(string *str)//快速排序{ system("cls"); cout << "\t\t快速排序\t\t" << endl; int n = input(str); cout << "从小到大排序好后:" <<endl; QuickSort(str, 0 , n - 1); output(str, n); cout <<"再从大到小排:" << endl; QuickSort(str, 0 , n - 1, cmpcmp,QuickSort_ChooseBaseNumber_Ballance); output(str, n); system("pause");}
上学期数据结构的一个作业。
- 【C++】自己的快速排序与二分插入排序的封装
- 快速排序/二分插入排序的swift以及Java实现
- C语言常用的排序方法:冒泡排序,插入排序,快速排序,堆排序,希尔排序
- 简单的快速排序与二分查找
- 自己写的递归快速排序(c++)
- 归并排序、插入排序、快速排序、二分查找的c++实现
- 冒泡排序,简单插入排序,快速排序,二分查找的JAVA实现
- 十二.C语言8种排序算法及其实现 1.希尔排序 2.二分插入法 3.直接插入法 4.带哨兵的直接排序法 5.冒泡排序 6.选择排序 7.快速排序 8.堆排序
- C语言8种排序算法及其实现 1.希尔排序 2.二分插入法 3.直接插入法 4.带哨兵的直接排序法 5.冒泡排序 6.选择排序 7.快速排序 8.堆排序
- 快速排序算法与插入排序算法的结合
- 自己写的插入排序
- 二分插入排序算法的C/C++实现
- java的冒泡排序、选择排序与插入排序与二分查找
- 快速排序与插入排序
- 插入排序与快速排序
- 插入排序与快速排序
- c语言归并、选择、直接插入、冒泡、快速、堆排序与顺序、二分查找
- 数组的插入排序和快速排序
- Java加解密艺术之DESede对称加密算法
- 通过宏在不同编译环境下的不同调用lib
- 【Java SE】对象的序列化和反序列化
- Win32 API 程序一样可以使用 CString
- 从myeclipse导入eclipse导致不能识别为web项目(java项目转为web项目)
- 【C++】自己的快速排序与二分插入排序的封装
- 在Windows Server 2003中安装Internet打印组件
- WPF DataGrid 分页自定义
- 十五周任务2
- C# listBox 设置
- Eclipse 代码提示功能设置
- 管理界面重新订制卡片窗体关闭的刷新事件
- 第十五周实验报告1
- 自定义视图中使用自定义变量