常见的C++排序问题
2018-03-08 22:50
351 查看
上学期刚刚学完的数据结构 这学期我竟然把排序问题忘记的一干二净所以在这里要麻溜的复习一下常见的C++排序问题~常见排序算法 插入排序 直接插入排序 折半插入排序 希尔排序交换排序 冒泡排序 快速排序选择排序 直接选择排序 堆排序一、插入排序1、直接插入排序void InsertSort(int arr[], int len) {int i, j;int temp;for (i = 1; i < len; i++) {temp = arr[i];for (j = i - 1; j >= 0 && arr[j] > temp;j--)arr[j + 1] = arr[j];arr[j + 1] = temp;}}2、折半插入排序
typedef int datatype; int BinaryInsertionSort(datatype *array, int size) { int i, j, low, high, mid; int temp; if(array == NULL) { return -1; } for(i = 1; i < size; i++) { low = 0; high = i-1; temp = array[i]; //跳出循环时low为插入位置 while(low <= high) { mid = (low + high) / 2; //若比中间记录小,则去左区间查找 if(array[mid] > temp) { high = mid - 1; } else { //否则去右区间查找 low = mid + 1; } } //将插入位置到待插入元素的位置上的元素整体向后移动一个位置 for(j = i; j > low; j--) { array[j] = array[j-1]; } array[low] = temp; } return 0; }3、希尔排序template <class T>void Shellsort(dataList<T>&L,const int left,const int right){int i,j,gap=right-left+1;Element<T> temp;do{gap=gap/3+1;for(i=left+gap;i<=right;i++){if(L[i]<L[i-gap]){temp=L[i];j=i-gap;do{L[j+gap]=L[j];j=j-gap;}while(j>=left&&temp<L[j]);L[j+gap]=temp;}}}while (gap>1);}二、交换排序1、冒泡排序void BubbleSort(int arr[], int len){int i,temp;//记录位置,当前所在位置和最后发生交换的地方int current,last = len - 1;while(last > 0) {for(i = current = 0;i < last;++i){if(arr[i] > arr[i+1]){temp = arr[i];arr[i] = arr[i+1];arr[i+1] = temp;//记录当前的位置,如果没有发生交换current值即for循环初始化的0current = i;}}//若current = 0即已经没有可以交换的元素了,即已经有序了last = current;}}2、快速排序void OnceSort(int arr[], int first, int end){int i = first,j = end;//当i<j即移动的点还没到中间时循环while(i < j){//右边区开始,保证i<j并且arr[i]小于或者等于arr[j]的时候就向左遍历while(i < j && arr[i] <= arr[j]) --j;//这时候已经跳出循环,说明j>i 或者 arr[i]大于arr[j]了,如果i<j那就是arr[i]大于arr[j],那就交换if(i < j){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}//对另一边执行同样的操作while(i < j && arr[i] <= arr[j]) ++i;if(i < j){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}//返回已经移动的一边当做下次排序的轴值return i;}三、选择排序1、直接选择排序2、堆排序//堆排序void HeapSort(int arr[],int len){int i;//初始化堆,从最后一个父节点开始for(i = len/2 - 1; i >= 0; --i){Heapify(arr,i,len);}//从堆中的取出最大的元素再调整堆for(i = len - 1;i > 0;--i){int temp = arr[i];arr[i] = arr[0];arr[0] = temp;//调整成堆Heapify(arr,0,i);}}void Heapify(int arr[], int first, int end){int father = first;int son = father * 2 + 1;while(son < end){if(son + 1 < end && arr[son] < arr[son+1]) ++son;//如果父节点大于子节点则表示调整完毕if(arr[father] > arr[son]) break;else {//不然就交换父节点和子节点的元素int temp = arr[father];arr[father] = arr[son];arr[son] = temp;//父和子节点变成下一个要比较的位置father = son;son = 2 * father + 1;}}}3、希尔排序二、交换排序1、冒泡排序2、快速排序三、选择排序1、直接选择排序2、堆排序
相关文章推荐
- C++常见问题解决办法
- 最简单的C++排序问题
- C++的STL库,vector sort排序时间复杂度 及常见容器比较
- java学习之路 之 面向对象编程-main方法的语法、数组排序、操作数组的工具类、数组操作常见问题
- C++ 常见崩溃问题分析
- 【面试常见问题】【C++】指针和引用的区别,有哪些不同点,细细道1
- c++中vector自定义排序的问题
- 字母排序问题(c++实现)
- C++面试常见问题
- C++常见面试问题
- C++中常见的文件读取结尾问题
- c++常见问题答案
- C++ 常见的几种排序!
- 2016年的C++常见的面试问题详解~搬至牛客网~3
- C++面试常见问题
- C++常见问题
- C++排序问题总结
- 面试常见的排序问题
- C++学习连载—合并排序及其遇到的问题
- C/C++编程常见问题(2)-错误打印64位长整数