排序总结归纳
2016-03-06 16:29
357 查看
对于一个int数组,请编写一个归并排序算法,对数组元素排序。
给定一个int数组A及数组的大小n,请返回排序后的数组。
测试样例:
1、冒泡排序 O(n^2)
2、归并排序 O(nlogn)
3、快速排序 O(nlogn)
4、堆排序 O(nlogn)
5、希尔排序
给定一个int数组A及数组的大小n,请返回排序后的数组。
测试样例:
[1,2,3,5,2,3],6
[1,2,2,3,3,5]
1、冒泡排序 O(n^2)
class BubbleSort { public: int* bubbleSort(int* A, int n) { for(int i=0;i<n;i++){ for(int j=i;j<n;j++){ int tmp; if(A[i]>A[j]){ tmp = A[i]; A[i]= A[j]; A[j]= tmp; } } } return A; } };
2、归并排序 O(nlogn)
class MergeSort { public: int* mergeSort(int* A, int n) { int* tmp = new int ; mergeSort1(A,0,n-1,tmp); delete []tmp; return A; } void mergeSort1(int* A,const int first,const int last,int* tmp){ if(first < last){ int mid = (first + last) / 2; mergeSort1(A,first,mid,tmp); mergeSort1(A,mid+1,last,tmp); merge(A,first,mid,last,tmp); } } void merge(int* A,const int first,const int mid,const int last,int* tmp){ int i=0,j=0,k=0; for(i=first,j=mid+1;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(i=0;i<k;i++){ A[first+i] = tmp[i]; } } };
3、快速排序 O(nlogn)
class QuickSort { public: int* quickSort(int* A, int n) { quickSort1(A,0,n-1); return A; } void quickSort1(int* A,const int first,const int last){ if(first<last){ int mid = Sort(A,first,last); quickSort1(A,first,mid); quickSort1(A,mid+1,last); } } int Sort(int* A,const int first,const int last){ int i=first; int j=last; int key = A[first]; if(first < last){ while(i<j){ while(i<j && key<=A[j]) j--; if(i<j) A[i++] = A[j]; while(i<j && key>=A[i]) i++; if(i<j) A[j--] = A[i]; } A[i] = key; } return i; } };
4、堆排序 O(nlogn)
class HeapSort { public: int* heapSort(int* A, int n) { int len = n; for(int i=len/2-1;i>=0;i--)//bulid the heap heapAdjust(A,i,len); for(int i=len-1;i>=1;i--){// swap and adjust swap(A,0,i); heapAdjust(A,0,i); } return A; } void heapAdjust(int* A,int idx,int len){ int left = 2*idx+1; int right = left+1; int largest = idx; if(left<len && A[left] > A[idx]) largest = left; if(right<len && A[right] > A[largest]) largest = right; if(largest != idx){ swap(A,idx,largest); heapAdjust(A,largest,len); } } void swap(int* A,int a,int b){ int tmp; tmp = A[a]; A[a]= A[b]; A[b]= tmp; } };
5、希尔排序
class ShellSort { public: int* shellSort(int* A, int n) { for(int step=n/2;step>=1;step /= 2){ for(int i=0;i<n;i+=step){ int tmp = A[i]; int j = i-step; for(;j>=0;j-=step){ if(A[j]>tmp) A[j+step] = A[j]; else break; } A[j+step] = tmp; } } return A; } };
相关文章推荐
- iOS - Swift - 图书展示项目
- 三月活动之“桃花朵朵开 求爱上上签”
- 10. smarty 方法
- ZooKeeper原理及使用
- poj3660 Cow Contest
- Android BLE开发之Android手机与BLE终端通信
- 解决下载文件过程中内存暴涨之---OutputStream
- 软件工程概论阅读笔记1
- C#第三节课(1)
- 今天晴朗,但是由于晚上睡眠不是很好就头昏眼花
- Numpy中如何给矩阵增加一行或一列
- TYVJ 4354 多重背包二进制优化
- Latex 参考文献类型和写法
- TYVJ 4354 多重背包二进制优化
- java多线程网页下载代码
- 华为机试题--24点游戏--In Java
- MySQL数据库复制概论
- JavaMail
- 重构代码的7个阶段
- poj 3660 Cow Contest