数据结构-Sort
来源:互联网 发布:Sql 字符串转成数组 编辑:程序博客网 时间:2024/06/08 03:08
Sort好好复习了一下,不容易啊...
#include#include #include #include #include #include #include #include #include #include #include #include #include /*made by davidsu33 2017-6-14*/#define MAX_SHOW_COUNT 100//#define USE_DEPNUMSconstexpr int sortCount{200000000};using namespace std;typedef int DataType;typedef function SortFunc;template void dumpData(Iterator start, Iterator end){ std::copy(start, end, ostream_iterator (cout, ",")); cout< m_data; bool m_showData {true};};void SortModel::sort(){ if(!m_sortFunc){ return; } shuffleData(); cout<<"数据个数:"< m_data[i]) { assert(false); cout<<"排序错误!!!"< (cout, ",")); cout< arr[1]) swap(arr[0], arr[1]); }}//插入排序void insert_sort(DataType *arr, int length){ if(length <= 2) { return common_sort(arr, length); } show_sort_name("插入排序"); DataType tmp{0}; int j{0}; for(int i=1; i =0 && arr[j] > tmp; --j) { arr[j+1] = arr[j]; } arr[j+1] = tmp; }}//Shell排序void shell_sort(DataType *arr, int length){ if(length <= 2) return common_sort(arr, length); show_sort_name("希尔排序"); DataType tmp{0}; int i{0},j{0}, span= length/2; while(span >= 1) { for(i=span; i =0 && tmp < arr[j]; j-=span) { arr[j+span] = arr[j]; } arr[j+span] = tmp; } span /= 2; }}/*!冒泡排序的特点,起点相同,终点的和等于length-1*///冒泡排序,往左冒泡void bubble_sort_left(DataType *arr, int length){ if(length <= 2) return common_sort(arr, length); show_sort_name("冒泡排序"); for(int i=length-1; i>0; --i) { for(int j=length-1; j>length-1-i; --j) { if(arr[j] < arr[j-1]) { swap(arr[j], arr[j-1]); } } }}//冒泡排序,往右冒泡void bubble_sort_right(DataType *arr, int length){ if(length <= 2) return common_sort(arr, length); show_sort_name("冒泡排序"); for(int i=0; i arr[j]) ... } 貌似第一眼很对,但是??,该数据达不到最后一个值, 排序一定要考虑边界问题,上面的写法改成 for(int j=1; j arr[j]) 同样是正确的 */ for(int j=0; j arr[j+1]) swap(arr[j], arr[j+1]); } }}//冒泡排序void bubble_sort(DataType *arr, int length){ bubble_sort_right(arr, length);}/*ERROR It's not bubble sortvoid bubble_sort_optimize(DataType *arr, int length){ if(length <= 2) return common_sort(arr, length); show_sort_name("冒泡排序(标志位优化)"); bool flag {false}; for(int i=0; i arr[j]) { swap(arr[i], arr[j]); flag = false; } } if(flag) break; }}*/void bubble_sort_optimize(DataType *arr, int length){ if(length <= 2) return common_sort(arr,length); show_sort_name("冒泡排序(标志位优化)"); bool flag{false}; for(int i=0; i arr[j+1]) { swap(arr[j], arr[j+1]); flag = false; } } if(flag) break; }}//快速排序void quick_sort_private(DataType *arr, int l, int r){ if(l >= r) return; int index = (l+r)/2; const int tmp{arr[index]}; /*! 找到适合于tmp值自己的位置 */ int i{l}, j{r}; while(i < j) { for(; i tmp) { arr[index] = arr[i]; index = i; //cout<<"arr[i]>tmp"<<"("<"< index; --j) { if(arr[j] < tmp) { arr[index] = arr[j]; index = j; //cout<<"arr[j]>tmp"<<"("<= high) { return; } int first = low; int last = high; int key = a[first];/*用字表的第一个记录作为枢轴*/ cout<<"need to find key= "< = key) { --last; } cout<());}void select_sort(DataType *arr, int length){ show_sort_name("直接选择排序"); int index{0}; for(int i=0; i arr[j]) { index = j; } } if(index != i) { swap(arr[i],arr[index]); } }}void heapfiy(DataType *arr, int i, int length){ //找到该节点的孩子节点(第一个非叶子节点的孩子一定是叶子节点) int nChild = (2*i + 1); if(nChild >= length) return; /*! 选择左右子节点中大得那个,建立大根堆 */ if(nChild < (length-1) && arr[nChild] < arr[nChild+1]) { nChild++; } /*! 由于从最后一个非叶子节点开始构建,所以子节点一定已经成立 */ if(arr[i] < arr[nChild]) swap(arr[i], arr[nChild]); heapfiy(arr, nChild, length);}void heap_sort(DataType *arr, int length){ /*!将当前数据构建堆数据,二叉堆*/ show_sort_name("堆排序"); /*!从最后一个非叶子节点开始进行调整,一直调整到根节点*/ int lastNonLeaf{(length-2)/2}; for(int i=lastNonLeaf; i>=0; --i) { heapfiy(arr, i, length); } bool is_heap = std::is_heap(arr, arr+length); if(!is_heap){ cout<<"构建堆错误!!!!"< 0; --i) { swap(arr[i], arr[0]); heapfiy(arr, 0, i); }}/*! * \brief merge_private * \param arr * \param tmp * \param start * \param mid * \param end * 根据start,mid,end的索引信息来确定要归并的数据范围,将数据合并到tmp临时区中,合并完成后拷贝回arr */void merge_private(DataType *arr, DataType *tmp, int start, int mid, int end){ //i操作arr的第一个区块,j操作arr的第二个区块 //k操作tmp int i{start}, j{mid+1}, k{start}; while(i != mid+1 && j != end+1) { /*!将区块中较小的数据归并到数组tmp中*/ if(arr[i] > arr[j]) { arr[k] = arr[j]; ++j; } else { arr[k] = arr[i]; ++i; } k++; } /*!将区块中没有拷贝完的数据,[注:都是大数据]拷贝至临时数组*/ while(i != mid+1) { arr[k] = arr[i]; k++; i++; } /*!将区块中没有拷贝完的数据,[注:都是大数据]拷贝至临时数组*/ while(j != end+1) { arr[k] = arr[j]; k++; j++; } /*!已经将数据合并至tmp中,现在将数据拷贝回arr*/ for(int i=start; i<=end; ++i) { arr[i] = tmp[i]; }}/*! * \brief merge_sort_private * \param arr * \param tmp * \param start * \param end * 将数据切分成一组组的,分割到最小单位相邻距离=1,每组内的数据只有一个 */void merge_sort_private(DataType *arr, DataType *tmp, int start, int end){ if(!arr || !tmp) return; if(start < end) { int mid = (start + end) /2; merge_sort_private(arr, tmp, start, mid); merge_sort_private(arr, tmp, mid+1, end); merge_private(arr, tmp, start, mid, end); }}/*! 归并排序 空间占用会增加一倍*/void merge_sort(DataType *arr, int length){ std::vector tmp(length); merge_sort_private(arr, &tmp[0], 0, length-1);}void heap_test(){ vector v {1,2,3,4,8,10,100,100,8,9,66,89,14,56,890}; dumpData(v.begin(), v.end()); make_heap(v.begin(), v.end()); dumpData(v.begin(), v.end());}//==================================================int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); //SortModel(bubble_sort, sortCount).sort(); //SortModel(bubble_sort_optimize, sortCount).sort(); /*====性能测试(未做EXE优化) MAC (8g)系统测试==== * !2000万的数据量: * heap_sort 12s * shell_sort 14s * quick_sort 8s * merge_sort 3s * * 2亿的数据量: * heap_sort 200s * shell_sort 228s * quick_sort 52s * merge_sort 40s */ /*SortModel(heap_sort, sortCount).sort(); SortModel(shell_sort, sortCount).sort(); */ //SortModel(quick_sort, sortCount).sort(); //SortModel(merge_sort, sortCount).sort(); /*for(int i=0; i<1000; ++i) SortModel(merge_sort, sortCount).sort(); */ /*DataType arr[] {1,100,2,4,6,5,90,9,8}; constexpr int length = sizeof(arr)/sizeof(DataType); bubble_sort_optimize(&arr[0], length); dumpData(&arr[0], &arr[0]+length); assert(std::is_sorted(&arr[0], &arr[0]+length, less ())); */ //for(int i=0; i<10;++i) // SortModel(bubble_sort, sortCount).sort(); //heap_test(); /* SortModel(insert_sort, sortCount).sort(); SortModel(bubble_sort, sortCount).sort(); SortModel(shell_sort, sortCount).sort(); SortModel(quick_sort, sortCount).sort(); SortModel(select_sort, sortCount).sort(); SortModel(STL_qsort, sortCount).sort(); */ //SortModel(Qsort, sortCount, true).sort(); //for(int i=0; i<10; ++i) // SortModel(Qsort, sortCount, false).sort(); return 0;}
阅读全文
0 0
- 数据结构-Sort
- 数据结构复习8.Sort
- 数据结构-冒泡排序(Bubble Sort)
- 数据结构基础(1) --Swap & Bubble-Sort & Select-Sort
- 数据结构基础(1) --Swap & Bubble-Sort & Select-Sort
- 数据结构基础(1) --Swap & Bubble-Sort & Select-Sort
- 数据结构基础(1) --Swap & Bubble-Sort & Select-Sort
- 算法数据结构C++ - Bucket Sort 吊桶排序
- 数据结构实验之排序三:bucket sort
- 数据结构实验之排序三:bucket sort
- 自定义数据结构使用sort函数排序
- 数据结构实验之排序三:bucket sort
- 数据结构实验之排序三:bucket sort
- 数据结构实验之排序三:bucket sort
- 数据结构实验之排序三:bucket sort
- 数据结构实验之排序三:bucket sort
- 数据结构实验之排序三:bucket sort
- 数据结构实验之排序三:bucket sort
- all available gssapi mechanisms failed错误解决
- 利用 Project Lombok 自定义 AST 转换
- python学习(14)--numpy库(1)
- 洛谷Oj-疯狂的采药-完全背包
- centos 7.3 安装 nginx 及简单配置
- 数据结构-Sort
- OpenGL固定管线与可编程管线对比
- 【Annotation】@PathVariable是什么鬼?
- Unity编辑器重写Inspector面板,面板中编辑的数据不触发场景发生变化的问题。
- PhotoView大图绘制——硬件加速限制
- Ubuntu 安装Clion和运行使用总结
- python函数一
- Linux写时复制技术(copy-on-write)
- 算法细节系列(35):不一样的排序