【算法】几种排序代码
2017-03-17 17:53
465 查看
#include<iostream> #include<cstdlib> using namespace std; int ThreeMid(int * arr,int left,int right) { int mid=left+((right-left)>>1); while (left<right) { if(arr[left]<arr[right]) { if(arr[mid]<arr[left]) return left; else if(arr[right]<arr[mid]) return right; else return mid; } if(arr[left]>arr[right]) { if(arr[mid]<arr[right]) return right; else if(arr[mid]>arr[left]) return left; else return mid; } } return mid; } void PopSort(int* arr,int len) { for (int i=0;i<len;i++) { for(int j=i+1;j<len;j++) { if (arr[i]>arr[i+1]) { int tmp=arr[i]; arr[i]=arr[i+1]; arr[i+1]=tmp; } } } } void selectSort(int* arr,int len) { int min; int tmp; for(int i=0;i<len;i++) { for (int j=0;j<len;j++) { min=i; if(arr[min]>arr[j]) { min=j; } tmp=arr[min]; arr[min]=arr[j]; arr[j]=tmp; } } } void selectSort2(int* arr,int len) { int left=0; int right=len-1; while (left<right) { int min=left; int max=right; for(int i=left;i<=right;i++) { if (arr[min]>=arr[i]) { min=i; } if(arr[max]<=arr[i]) { max=i; } } swap(arr[left],arr[min]); if(left==max) { max=min; } swap(arr[right],arr[max]); left++; right--; } } void InsertSort(int* arr,int len) { for(int i=1;i<len;i++) { int tmp=arr[i]; int pos=i-1; while (pos>=0&&arr[pos]>tmp) { arr[pos+1]=arr[pos]; pos--; } arr[pos+1]=tmp; } } void ShellSort(int* arr,int len) { int gap=len/3+1; for (int i=gap;i<len;i++) { int tmp=arr[i]; int pos=i-gap; while (pos>=0&&arr[pos]>tmp) { arr[pos+gap]=arr[pos]; pos-=gap; } arr[pos+gap]=tmp; } } void FastSort(int* arr,int low,int high) { if(low>=high) return; int first=low; int last=high; int mid=ThreeMid(arr,first,last); swap(arr[mid],arr[first]); int key=arr[first]; while (first<last) { while (first<last&&arr[last]>=key) { --last; } arr[first]=arr[last]; while (first<last&&arr[first]<=key) { ++first; } arr[last]=arr[first]; } arr[first]=key; FastSort(arr,low,first-1); FastSort(arr,first+1,high); } int PartSort(int* arr,int first,int last) { int left=first; int right=last; int key=ThreeMid(arr,first,last); swap(arr[key],arr[last]); int tmp=arr[last]; while (left<right) { while (left<right&&arr[left]<=tmp) { ++left; } arr[right]=arr[left]; while (left<right&&arr[right]>=tmp) { --right; } arr[left]=arr[right]; } arr[left]=tmp; return left; } void QuickSort(int* arr,int first,int last) { if (first<last) { int key=PartSort(arr,first,last); QuickSort(arr,first,key-1); QuickSort(arr,key+1,last); } } //快排优化,少于13个数用插入排序 void QuickSort2(int* arr,int first,int last) { if (first<last) { if((last-first)>=13) { int key=PartSort(arr,first,last); QuickSort2(arr,first,key-1); QuickSort2(arr,key+1,last); } else InsertSort(arr,sizeof(arr)/sizeof(int)); } } //归并排序 void Merge(int* arr,int* tmp,int first,int mid,int last)//归并 { int i=first; int j=mid+1; int k=first; while (i!=mid+1&&j!=last+1) { if(arr[i]>arr[j]) tmp[k++]=arr[j++]; else tmp[k++]=arr[i++]; } while(i!=mid+1) { tmp[k++]=arr[i++]; } while (j!=last+1) { tmp[k++]=arr[j++]; } for(i=first;i<=last;i++) arr[i]=tmp[i]; } void MergeSort(int* arr,int* tmp,int first,int last)//归并排序 { int mid; if (first<last) { mid= first+((last-first)>>1); MergeSort(arr,tmp,first,mid); MergeSort(arr,tmp,mid+1,last); Merge(arr,tmp,first,mid,last); } } void Print(int *arr,int len) { for(int i=0;i<len;i++) { cout<<arr[i]<<" "; } cout<<endl; } void test() { int arr[]={9,3,5,1,4,7,8,0}; int tmp[8]; //int arr[]={2,3,6,5,4,13,56}; cout<<"原数组 : "; Print(arr,sizeof(arr)/sizeof(arr[0])); InsertSort(arr,sizeof(arr)/sizeof(arr[0])); cout<<"插入排序: "; Print(arr,sizeof(arr)/sizeof(arr[0])); ShellSort(arr,sizeof(arr)/sizeof(arr[0])); cout<<"希尔排序: "; Print(arr,sizeof(arr)/sizeof(arr[0])); PopSort(arr,sizeof(arr)/sizeof(arr[0])); cout<<"冒泡排序: "; Print(arr,sizeof(arr)/sizeof(arr[0])); selectSort(arr,sizeof(arr)/sizeof(arr[0])); cout<<"选择排序: "; Print(arr,sizeof(arr)/sizeof(arr[0])); FastSort(arr,0,sizeof(arr)/sizeof(arr[0])-1); cout<<"快速排序: "; Print(arr,sizeof(arr)/sizeof(arr[0])); QuickSort(arr,0,sizeof(arr)/sizeof(arr[0])-1); cout<<"快速排序2: "; Print(arr,sizeof(arr)/sizeof(arr[0])); MergeSort(arr,tmp,0,sizeof(arr)/sizeof(arr[0])-1); cout<<"归并排序: "; Print(arr,sizeof(arr)/sizeof(arr[0])); QuickSort2(arr,0,sizeof(arr)/sizeof(arr[0])-1); cout<<"快速排序3:"; Print(arr,sizeof(arr)/sizeof(arr[0])); }
#include "Sort.h" int main() { test(); system("pause"); return 0; }
相关文章推荐
- 几种常见的排序算法之比较
- 排序的几种算法
- 几种二分查找算法的代码和比较
- 排序--归并算法思想及其代码实现
- 常见的排序算法之Java代码解释
- php读取30天之内的根据算法排序的代码
- 从“假如有以下几种价格10,20,50,请你代码实现将他们排序输出”看设计模式中的策略模式
- 教你几种排序的基本算法
- JAVA中的排序算法及代码实现
- 关于排序(冒泡、选择、插入、快速)的几种算法
- 【转】几种常见的排序算法之比较
- 【数据结构与算法基础】几种典型的排序算法 / Typical sort algorithms
- 几种排序的算法
- 教你几种排序的基本算法
- 算法 -- 几种基本排序深入探究
- 几种常见的排序算法之比较
- php不用内置函数对数组排序的两个算法代码
- 几种基本的排序算法:选择排序、插入排序、冒泡排序
- 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)
- 从“假如有以下几种价格10,20,50,请你代码实现将他们排序输出”看设计模式中的策略模式