插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序
2014-07-21 10:12
941 查看
#include<iostream> #include<vector> using namespace std; void print(int a[],int n); void InsertSort(int a[],int n) { for(int i=1;i<n;++i) { int tmp=a[i]; int j=i-1; while(j>=0 && a[j]>tmp) { a[j+1]=a[j]; --j; } a[j+1]=tmp; } } void BinInsertSort(int a[],int n) { int high; int low; int mid; for(int i=1;i<n;++i) { int tmp=a[i]; high=i-1; low=0; while(low<=high) { mid=(low+high)/2; if(tmp<=a[mid]) high=mid-1; else low=mid+1; } for(int j=i-1;j>=low;j--) a[j+1]=a[j]; a[low]=tmp; } } void ShellSort(int a[],int n) { int d=n/2; while(d>0) { for(int i=0;i<d;++i) { for(int j=i+1;j<n;j=j+d) { //分成d组,组内使用插入排序 int tmp=a[j]; int k=j-1; while(k>=i && a[k]>tmp) { a[k+1]=a[k]; --k; } a[k+1]=tmp; } } d=d/2; } } void SelectSort(int a[],int n) { for(int i=0;i<n-1;++i) { bool change=false; int min=i; for(int j=n-1;j>i;--j) { if(a[j]<a[min]) { change=true; min=j; } } if(min!=i) { int tmp=a[i]; a[i]=a[min]; a[min]=tmp; } if(!change) { //本次没有交换,已经排好序 return; } } } void BubbleSort(int a[],int n) { for(int i=0;i<n;++i) { bool change=false; for(int j=n-1;j>i;--j) { if(a[j-1]>a[j]) { int tmp=a[j]; a[j]=a[j-1]; a[j-1]=tmp; change=true; } } if(!change) return ; } } void CocktailSort(int a[],int n) { int tail=n-1; for(int i=0;i<=tail;++i) { bool change=false; for(int j=tail;j>i;--j) { if(a[j-1]>a[j]) { int tmp=a[j]; a[j]=a[j-1]; a[j-1]=tmp; change=true; } } if(!change) return; ++i; for(int j=i;j<tail;++j) { if(a[j]>a[j+1]) { int tmp=a[j]; a[j]=a[j+1]; a[j+1]=tmp; change=true; } } if(!change) return; --tail; } } int Partion(int a[],int p,int r) { //p为划分的起始位置,r为划分的结束位置,以a[r]为基准元 int i=p-1;//p-i为小于基准区间 for(int j=p;j<r;++j) { if(a[j]<a[r]) { ++i; if(i!=j) { int tmp=a[i]; a[i]=a[j]; a[j]=tmp; } } } ++i; int tmp=a[i]; a[i]=a[r]; a[r]=tmp; return i; } void QuickSOrt(int a[],int p,int r) { if(p<r) { int q=Partion(a,p,r); QuickSOrt(a,p,q-1); QuickSOrt(a,q+1,r); } } void QuickSort(int a[],int n) { QuickSOrt(a,0,n-1); } int getRightChild(const int i) { return 2*(i+1); } int getLeftChild(const int i) { return 2*(i+1)-1; } void HeapAdjust(int a[],int n,int root) { int max=root; int lcvalue=getLeftChild(root); if(lcvalue<n && a[lcvalue]>a[root]) { max=lcvalue; } int rcvalue=getRightChild(root); if(rcvalue<n && a[rcvalue]>a[max]) { max=rcvalue; } if(max!=root) { int tmp=a[root]; a[root]=a[max]; a[max]=tmp; HeapAdjust(a,n,max); } } void BuildHeap(int a[],int n) { for(int i=n/2-1;i>=0;--i) HeapAdjust(a,n,i); } void HeapSort(int a[],int n) { BuildHeap(a,n); // print(a,n); int j=n; while(j>0) { int tmp=a[0]; a[0]=a[j-1]; a[j-1]=tmp; --j; HeapAdjust(a,j,0); } } void MergeArrange(int a[],int first,int mid,int last,int tmp[]) { int i=first; int j=mid+1; int k=first; while(i<=mid && j<=last) { if(a[i]<a[j]) tmp[k++]=a[i++]; else tmp[k++]=a[j++]; } while(i<=mid) tmp[k++]=a[i++]; while(j<=last) tmp[k++]=a[j++]; for(int ii=first;ii<=last;++ii) a[ii]=tmp[ii]; } void MergeSort(int a[],int first,int last,int tmp[]) { if(first<last) { int mid=(first+last)/2; MergeSort(a,first,mid,tmp); MergeSort(a,mid+1,last,tmp); MergeArrange(a,first,mid,last,tmp); } } void MergeSort(int a[],int n) { int *tmp=new int ; MergeSort(a,0,n-1,tmp); delete[] tmp; } void print(int a[],int n) { for(int i=0;i<n;++i) cout<<a[i]<<' '; cout<<endl; } int main() { const int n=10; int a ={9,12,17,30,50,20,60,65,4,49}; //InsertSort(a,n); //BinInsertSort(a,n); //ShellSort(a,n); //SelectSort(a,n); //BubbleSort(a,n); //CocktailSort(a,n); //QuickSort(a,n); //HeapSort(a,n); MergeSort(a,n); print(a,n); return 0; }
相关文章推荐
- 笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算
- 基本的排序算法:冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 常用的排序算法(快速排序、插入排序、希尔排序、堆排序、冒泡排序、选择排序、归并排序)
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序
- 【程序员笔试面试必会——排序①】Python实现 冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序
- 冒泡排序,插入排序,快速排序,归并排序,堆排序,选择排序,希尔排序
- 数据结构与算法从零开始系列:冒泡排序、选择排序、插入排序、希尔排序、堆排序、快速排序、归并排序、基数排序
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 排序方法了解一下(冒泡排序、选择排序、堆排序、插入排序、希尔排序、归并排序、快速排序、基数排序)
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 直通BAT-排序1(冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序)
- 各种排序算法实现——基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- 常见排序集合(冒泡排序,选择排序,直接插入排序,二分插入排序,快速排序,希尔排序,归并排序)
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序java实现
- 各种排序算法总结----基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)
- C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——C++实现