C++实现各种基础排序(冒泡、选择、快排、插入、堆排、希尔、归并)
来源:互联网 发布:datatype json 编辑:程序博客网 时间:2024/05/16 08:59
#include "sort.h"/*-----------------交换类排序------------------------------*///冒泡排序bool BubbleSort(int arr[],int len){if (arr == NULL){return false;}bool bDone = true;//一个标记,只有当元素交换进行后,bDone= true,如果遍历一遍,元素没有交换证明原数组已有序,则不用再进行下去for (int i = len-1; i > 0&& bDone; --i){bDone = false;for (int j = 0; j < i; ++j){if (arr[j] > arr[j+1]){int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;bDone = true;}}}return true;}//冒泡排序的改进版/*上面算法中,变量i只往前进一步但有时候,这个序列后面部分连续几个已经都是有序的了,那么我们就不用在一个一个往前进了EX:数组 arr[] = {1,3,2,6,7}只有3,2是无序的,当j = 1时进入交换,交换完毕后,至少从j到最后都是有序的了所以只要我们记住交换位置j就可以省去一些过程*/bool BubbleSort2(int arr[],int len){if (arr == NULL){return false;}bool bDone = true;int last = len;int i = len-1;while(i>0 && bDone){ bDone = false;for (int j = 0;j <i; ++j){if (arr[j] >arr[j+1]){int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;bDone = true;last = j;//记住交换位置}}i = last;}return true;}//快速排序/*快速排序的思想就是通过选择一个关键字介于“中间”的元素快速将数组分成两部分,然后分别对这两部分进行排序快排的事件复杂度为O(nlogn),当所选关键字介于数组最中间时效率最高*/int Sort(int arr[],int left,int right){if (arr == NULL){return -1;}int temp = arr[left];int low = left,high = right;while (low < high){while(low <high && arr[high]>= temp)high--;arr[low] = arr[high];while (low <high && arr[low] <= temp)low ++;arr[high] = arr[low];}arr[low] = temp;return low;}bool QSort(int arr[],int start,int end){if (arr == NULL){return false;}int mid = 0;if(start <end){mid = Sort(arr,start,end);if (mid == -1){return false;}QSort(arr,0,mid-1);QSort(arr,mid+1,end);}return false;}/*------------------------------------选择类排序--------------------------------*///简单选择排序/*如果前i-1都是有序的,在后面的元素中找到最小的元素与第i个进行交换,那么前i个都是有序的了*/bool SelectSort(int arr[],int len){if (arr == NULL){return false;}for (int i = 0; i<len-1; ++i){int k = i;for (int j = i+1; j<len; ++j){if (arr[j] <arr[k]){k = j;}}if (k!= i){int temp = arr[i];arr[i] = arr[k];arr[k] = temp;}}return true;}//堆排void AdjustHeap(int arr[],int root,int end){//调整为大根堆if (arr == NULL){return;}int t=arr[root];int i = root*2+1;while( i <= end){if (i<end && arr[i]<arr[i+1]){i++;}if (arr[i] <= t){//原根节点是最大元素不用调整break;}else{arr[(i-1)/2] = arr[i];//将元素上调i = i*2+1;//继续寻找原根元素的合适位置}}arr[(i-1)/2] = t;}bool HeapSort(int arr[],int len){if (arr == NULL){return false;}for (int i = (len-1)/2; i>=0; --i){AdjustHeap(arr,i,len);//建堆}for (int i = len; i>0; --i){int temp = arr[0];//换元素arr[0] = arr[i];arr[i] = temp;AdjustHeap(arr,0,i-1);//重新调整堆}return true;}//归并排序/*先分而治之,然后再归并*/void Merge(int src[],int des[],int start,int mid,int end){int i = start,j = mid+1;int k = start;while(i <= mid && j<= end){if (src[i]< src[j]){des[k++] = src[i++];}elsedes[k++] = src[j++];}while (i<= mid){des[k++] = src[i++];}while( j <= end){des[k++] = src[j++];}}void MergeSort(int src[],int des[],int start,int end){if (src == NULL || des == NULL){return;}int len = (end-start)+1; int *p = new int[len]; memset(p,0,len); if (start == end) { des[end] = src[end]; } else { int mid = start + (end- start)/2;MergeSort(src,p,0,mid);MergeSort(src,p,mid+1,end);Merge(p,des,start,mid,end); }}/*-----------------------------------插入排序-----------------------*///直接插入排序/*找到一个不合适(顺序不对)的数,然后往前寻找到他合适的位置,将前面的元素都往后挪直到找到他的位置,插入正序效率最高,逆序效率最低 O(n^2)*/bool InsertSort(int arr[],int len){if (arr== NULL){return false;} for(int i = 1; i<len; ++i) { if (arr[i] <arr[i-1]) { int temp = arr[i]; int j = i-1; for (; j>=0 && arr[j] >temp;--j) {//寻找位置,并往后挪 arr[j+1] = arr[j]; } arr[j+1] = temp; } } return true;}//折半插入排序/*只有一点与直接插入不同:直接插入排序在寻找合适位置时是一个一个查找,而折半插入在查找合适位置时使用二分查找的思想查找,所以在查找这里节省了时间但是他只是在查找上节省时间,复杂度仍为O(n^2)*/bool HalfSort(int arr[],int len){if (arr == NULL){return false;}for (int i = 1; i<len; ++i){if (arr[i] <arr[i-1]){int temp = arr[i];int low = 0;int high = i;while(low <high){int mid = low+ (high-low)/2; if (arr[mid] <temp ) {low = mid+1; } else high = mid-1;}int j = 0;for ( j= i-1; j>= low; --j){arr[j+1] = arr[j];}arr[j+1] = temp;}}return true;}//希尔排序/*一次选取一个step,进行交换比较,每次缩短Step,直至Step=1,Step = 1的时候其实就是直接插入排序Shell排序就是为了减小元素据其最终位置的距离,减小移动次数*/bool ShellSort(int arr[],int len,int step){if(arr == NULL){return false;}while(step >=1){for (int i = step; i<len;++i){if (arr[i] <arr[i-step]){int temp = arr[i];int j = 0;for (j = i-step;j >=0 && arr[j] > temp; j-=step){arr[j+step] = arr[j];}arr[j+step ] =temp;}}step /=2;}}
以上排序,虽然简单,但是全是基础啊亲,笔试面试什么的一定要准备上
【热爱工作,热爱生活】
0 0
- C++实现各种基础排序(冒泡、选择、快排、插入、堆排、希尔、归并)
- 各种排序算法(冒泡、选择、快排、插入、希尔、堆排、归并、计数、基数)
- 常见排序算法总结与实现(冒泡、插入、选择、希尔、堆排序、归并、快排)
- 排序算法:快排,插入,希尔,归并,堆,选择,冒泡
- 常见排序算法C++实现(冒泡,直接插入,希尔,堆,归并,简单选择,快排)
- 冒泡 选择 插入 归并 快排 堆排 希尔
- 排序(插入,希尔,选择,堆排序,归并,快排)
- 排序算法 快排 堆排 选择 插入 希尔 归并
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- 八种排序算法(直接插入,希尔,直接选择,堆,冒泡,快排,归并,基数)
- 各类排序C++实现(冒泡,选择,插入,快排,归并,堆排)
- 各种排序的实现:希尔 归并 堆排 快排
- 排序及选择算法的java实现(一)选择、冒泡、插入、希尔、归并、快排
- 各种基本排序(直接插入;希尔;选择;堆;冒泡;快排)
- 排序(快排,冒泡,堆排序,插入排序,归并排序,选择排序)算法Java实现
- Java中堆内存和栈内存详解
- git and repo 地址
- android native service编写及两个服务进程通讯
- Springmvc和poi3.9导出excel并弹出下载框
- 先验与后验概率区别
- C++实现各种基础排序(冒泡、选择、快排、插入、堆排、希尔、归并)
- matlab函数interp2及其c++代码
- android的Service----讲述四大组件之一服务
- Android ADB server didn't ACK * failed to start daemon
- Android如何去除标题栏
- 【新机械楼537的Kinect编程学习基础篇(一)】最简单的通过kinect获取图像的代码
- rdtsc 备忘
- 黑马程序员_JAVA基础——常用DOS命令,环境变量配置
- scp时候出现ssh Connection refused的解决方案