各种排序实现
来源:互联网 发布:java 获取当前locale 编辑:程序博客网 时间:2024/05/16 15:11
冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、基数排序、堆排序的实现:
#ifndef Sort_H_#define Sort_H_#include <iostream>#include <cstring>#include <queue>#include <math.h>#include <conio.h>using namespace std;inline void exchange(int &a,int &b){ int temp=a; a=b; b=temp;}void print(int *array,int n){ for(int i=0; i<n; i++) { cout<<array[i]<<" "; } cout<<endl;}//------------------------------bubbleSort----------------------------------//O(n^2)void bubbleSort(int *array,int n){ for(int i=n-1; i>=0; i--) { bool flag=0; for(int j=0; j<i; j++) { if(array[j]>array[j+1]) { exchange(array[j],array[j+1]); flag=1; } } if(!flag)break; }}//-------------------------selectSort------------------------------------//O(n^2)void selectSort(int *array,int n){ for(int i=0; i<n-1; i++) { int lowIndex=i; for(int j=i+1; j<n; j++) { if(array[lowIndex]>array[j]) { lowIndex=j; } } exchange(array[i],array[lowIndex]); }}//-------------------------insertSort-----------------------------------//O(n^2)void insertSort(int *array,int n){ for(int i=1; i<n; i++) { int cur=array[i]; int j; for(j=i-1; j>=0&&cur<array[j]; j--) { array[j+1]=array[j]; } array[j+1]=cur; }}//--------------------------------shellSort---------------------------------//maybe O(n^1.5)//修改过的插入排序void shellSortHelp(int *array,int n,int inc){ for(int i=inc; i<n; i++) { int cur=array[i]; int j; for(j=i-inc; j>=0&&cur<array[j]; j-=inc) { array[j+inc]=array[j]; } array[j+inc]=cur; }}//第一趟将序列分成n/2个长度至多为2的子序列,这时子序列中相邻两个元素下标差n/2//第二趟 n/4//直到增量为1为止,将增量存在inc[]中void shellSort(int *array,int n){ int inc[100]; memset(inc,0,sizeof(inc)); int count=0; int temp=n; while(temp/2) { temp=temp/2; inc[count++]=temp; } for(int i=0; i<count; i++) { shellSortHelp(array,n,inc[i]); }}//-----------------------------mergeSort-----------------------------------//O(nlogn)void merge(int*array,int *tempArray,int low,int mid,int high){ //操作结果:将有子序列array[low...mid]和array[mid+1,high]归并为新的有序序列array[low...high] int i,j,k; //一个从头往后撸,一个从中间往后撸 for(i=low,j=mid+1,k=low; i<=mid&&j<=high; k++) { if(array[i]<=array[j]) { tempArray[k]=array[i]; i++; } else { tempArray[k]=array[j]; j++; } } //前边没撸完的接着撸完 for(; i<=mid; i++,k++) { tempArray[k]=array[i]; } //后边的 for(; j<=high; j++,k++) { tempArray[k]=array[j]; } //导回去 for(i=low; i<=high; i++) { array[i]=tempArray[i]; }}void mergeSortHelp(int *array,int *tempArray,int low,int high){ if(low<high) { //2路归并排序 int mid=(low+high)/2; mergeSortHelp(array,tempArray,low,mid); mergeSortHelp(array,tempArray,mid+1,high); merge(array,tempArray,low,mid,high); }}void mergeSort(int *array,int n){ int *tempArray=new int[n]; mergeSortHelp(array,tempArray,0,n-1); delete []tempArray;}//O(nlogn)//-----------------------------quickSort---------------------------------int partition(int *array,int low,int high){ while(low<high) { while(low<high&&array[high]>=array[low]) { high--; } exchange(array[low],array[high]); while(low<high&&array[low]<=array[high]) { low++; } exchange(array[low],array[high]); } return low;}void quickSortHelp(int *array,int low,int high){ if(low<high) { int pivotLoc=partition(array,low,high); quickSortHelp(array,low,pivotLoc-1); quickSortHelp(array,pivotLoc+1,high); }}void quickSort(int *array,int n){ quickSortHelp(array,0,n-1);}//O(d*n) d is weishu//--------------------------------radixSort----------------------------------------void radixSort(int *array,int n,int d){ queue<int>Q[10]; queue<int>A; int i,j; int m1=10; int m2=1; for (j=0; j<n; j++) { A.push(array[j]); } for(i=0; i<d; i++) { while(!A.empty()) { int temp=A.front()%m1/m2; Q[temp].push(A.front()); A.pop(); } m1*=10; m2*=10; for(j=0; j<10; j++) { while(!Q[j].empty()) { A.push(Q[j].front()); Q[j].pop(); } } } int k=0; while(!A.empty()) { array[k++]=A.front(); A.pop(); }}//----------------------------------heapSort-------------------------------------void siftAdjust(int *array,int low,int high){ int adjust,i;//adjust is now to change for(adjust=low,i=2*low+1; i<=high; i=2*i+1) { if(i<high && array[i]<array[i+1]) i++;//cause the right child is biger so point to the right. if(array[adjust]>=array[i])break; exchange(array[adjust],array[i]); adjust=i; }}void heapSort(int *array,int n){ int i; for(i=(n-2)/2; i>=0; i--) { siftAdjust(array,i,n-1); } for(i=n-1; i>0; i--) { exchange(array[0],array[i]); siftAdjust(array,0,i-1); }}#endif
- 各种排序的实现
- 各种排序实现
- 各种排序算法实现
- 各种排序的实现
- 各种排序算法实现
- Java实现各种排序
- js 实现各种排序
- Java实现各种排序
- 各种排序算法实现
- Python实现各种排序
- 各种排序算法java实现
- 各种排序算法java实现
- 各种排序算法java实现
- 各种排序算法Java实现
- 各种排序算法java实现
- 各种排序算法java实现
- 各种排序算法java实现
- 各种排序算法java实现
- ubuntu下单机配置hadoop(图解)
- 排列与组合的算法
- poj 2395
- 使用C#去掉10万级数组中重复的数据
- zoj 2958 (模拟题)待改正
- 各种排序实现
- sql查询表结构,过程,视图,主键,外键,约束
- ORACLE通过netca配置监听遇到 TNS-04415错误
- Asp.net Form Action
- 看看培训中心培训Android系统开发培训都讲些啥
- 排序性能测试比较
- 从索引技术谈数据库查询索引建立和查询条件书写
- .h头文件 .lib库文件 .dll动态链接库文件关系
- vs2008快捷键极其技巧