几种排序方法的比较(选择、冒泡、归并、快排)
2017-10-30 16:13
253 查看
代码:
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<ctime>
using namespace std;
const int maxn = 50000;
//冒泡排序:
void bubble(int a[],int len){
for(int i = 0;i < len-1;i++){
for(int j = 0; j < len-i-1; j++){
if(a[j] > a[j+1]){
int temp = a[j]; a[j] = a[j+1]; a[j+1] = temp;
}
}
}
}
//选择排序:
void select(int a[],int len){
for(int i = 0 ; i < len-1; i++){
int min = i;
for(int j = i; j < len; j++){
if(a[min] > a[j]){
min = j;
}
}
if(min != i){
int temp = a[i]; a[i] = a[min]; a[min] = temp;
}
}
}
//归并算法:
void Merge(int a[],int b[],int left, int i ,int right){
int j = 0;
int r = i+1;
int l = left;
int k;
int t;
while(l<=i && r<=right){
if(a[l] <= a[r]){
b[j++] = a[l++];
}else{
b[j++] = a[r++];
}
}
if(l<=i){
for(k = l; k <= i; k++){
b[j++] = a[k];
}
}
else if(r<=right){
for(k = r; k <= right; k++){
b[j++] = a[k];
}
}
//从b数组合并到a数组
j = 0;
for(k = left; k <= right; k++){
a[k] = b[j++];
}
}
void MergeSort(int a[],int b[],int left,int right){
int i;
if(left < right){
i = (left+right)/2;
MergeSort(a,b,left,i);
MergeSort(a,b,i+1,right);
Merge(a,b,left,i,right); //合并
}
}
//快速排序:
int Partition(int a[],int p,int r){
int i = p;
int j = r,x = a[p];
while(i<j){
while(j>=p && a[j]>x)j--;
if(i < j){
a[i++] = a[j];
}
while(i<=r && a[i]<x)i++;
if(i < j){
a[j--] = a[i];
}
}
a[j] = x;
return j;
}
void QuickSort(int a[],int p,int r){
if(p<r){
int q = Partition(a,p,r);
QuickSort(a,p,q-1);
QuickSort(a,q+1,r);
}
}
int main(){
int a[maxn] , b[maxn] , c[maxn];
for(int i = 0; i < maxn; i++){ //产生随机数
a[i] = rand();
c[i] = a[i];
}
double bstart = clock();
bubble(a,maxn);
double bend = clock();
for(int i = 0; i < maxn; i++){ //保证每次排序的数据及顺序相同
a[i] = c[i];
}
double sstart = clock();
select(a,maxn);
double send = clock();
for(int i = 0; i < maxn; i++){
a[i] = c[i];
}
double qstart = clock();
QuickSort(a,0,maxn-1);
double qend = clock();
for(int i = 0; i < maxn; i++){
a[i] = c[i];
}
double mstart = clock();
MergeSort(a,b,0,maxn-1);
double mend = clock();
// for(int i = 0; i < 100; i++){ //测试排序是否正确
// printf("%d ",a[i]);
// }
printf("\n");
printf("用冒泡、选择、快排、归并排序50000个随机数,时间复杂度做比较:\n");
printf("冒泡排序所用时间:%.2lf\n",bend-bstart);
printf("选择排序所用时间:%.2lf\n",send-sstart);
printf("快速排序所用时间:%.2lf\n",qend-qstart);
printf("归并排序所用时间:%.2lf\n",mend-mstart);
return 0;
}
测试了一些数据,貌似归并是最快的,当然快排也不赖
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<ctime>
using namespace std;
const int maxn = 50000;
//冒泡排序:
void bubble(int a[],int len){
for(int i = 0;i < len-1;i++){
for(int j = 0; j < len-i-1; j++){
if(a[j] > a[j+1]){
int temp = a[j]; a[j] = a[j+1]; a[j+1] = temp;
}
}
}
}
//选择排序:
void select(int a[],int len){
for(int i = 0 ; i < len-1; i++){
int min = i;
for(int j = i; j < len; j++){
if(a[min] > a[j]){
min = j;
}
}
if(min != i){
int temp = a[i]; a[i] = a[min]; a[min] = temp;
}
}
}
//归并算法:
void Merge(int a[],int b[],int left, int i ,int right){
int j = 0;
int r = i+1;
int l = left;
int k;
int t;
while(l<=i && r<=right){
if(a[l] <= a[r]){
b[j++] = a[l++];
}else{
b[j++] = a[r++];
}
}
if(l<=i){
for(k = l; k <= i; k++){
b[j++] = a[k];
}
}
else if(r<=right){
for(k = r; k <= right; k++){
b[j++] = a[k];
}
}
//从b数组合并到a数组
j = 0;
for(k = left; k <= right; k++){
a[k] = b[j++];
}
}
void MergeSort(int a[],int b[],int left,int right){
int i;
if(left < right){
i = (left+right)/2;
MergeSort(a,b,left,i);
MergeSort(a,b,i+1,right);
Merge(a,b,left,i,right); //合并
}
}
//快速排序:
int Partition(int a[],int p,int r){
int i = p;
int j = r,x = a[p];
while(i<j){
while(j>=p && a[j]>x)j--;
if(i < j){
a[i++] = a[j];
}
while(i<=r && a[i]<x)i++;
if(i < j){
a[j--] = a[i];
}
}
a[j] = x;
return j;
}
void QuickSort(int a[],int p,int r){
if(p<r){
int q = Partition(a,p,r);
QuickSort(a,p,q-1);
QuickSort(a,q+1,r);
}
}
int main(){
int a[maxn] , b[maxn] , c[maxn];
for(int i = 0; i < maxn; i++){ //产生随机数
a[i] = rand();
c[i] = a[i];
}
double bstart = clock();
bubble(a,maxn);
double bend = clock();
for(int i = 0; i < maxn; i++){ //保证每次排序的数据及顺序相同
a[i] = c[i];
}
double sstart = clock();
select(a,maxn);
double send = clock();
for(int i = 0; i < maxn; i++){
a[i] = c[i];
}
double qstart = clock();
QuickSort(a,0,maxn-1);
double qend = clock();
for(int i = 0; i < maxn; i++){
a[i] = c[i];
}
double mstart = clock();
MergeSort(a,b,0,maxn-1);
double mend = clock();
// for(int i = 0; i < 100; i++){ //测试排序是否正确
// printf("%d ",a[i]);
// }
printf("\n");
printf("用冒泡、选择、快排、归并排序50000个随机数,时间复杂度做比较:\n");
printf("冒泡排序所用时间:%.2lf\n",bend-bstart);
printf("选择排序所用时间:%.2lf\n",send-sstart);
printf("快速排序所用时间:%.2lf\n",qend-qstart);
printf("归并排序所用时间:%.2lf\n",mend-mstart);
return 0;
}
测试了一些数据,貌似归并是最快的,当然快排也不赖
相关文章推荐
- 六种排序方法的学习(直接插入、希尔、冒泡、快速、选择、归并)
- 几种排序算法 冒泡、快速排序、归并、选择排序等
- 数据结构(C#)--冒泡、插入、快速、堆、归并、希尔、选择各种排序排序过程比较以及各种排序的所用时间的对比
- 《面试》 几种经典的简单的排序方法(冒泡,选择,插入)python实现
- c++实现数据结构中的各种排序方法:直接插入、选择,归并、冒泡、快速、堆排序、shell排序
- Java实现的排序算法及比较 [冒泡,选择,插入,归并,希尔,快排]
- Java对一维数组排序:冒泡,选择,插入,比较效率
- 选择、冒泡、快速、归并、插入排序算法的运行时间比较
- 排序——冒泡、归并、快速、选择、插入、堆
- 随手记录--java排序(1)冒泡、选择、希尔、归并
- 各种内部排序算法复杂度的比较和排序方法的选择
- 几种常用的排序方法3--选择排序
- C数据结构-几种常见的排序:冒泡,选择,插入,希尔
- c# 自定义排序类(冒泡、选择、插入、希尔、快速、归并、堆排序等)
- 各类排序C++实现(冒泡,选择,插入,快排,归并,堆排)
- 各种内部排序方法的比较和选择
- CUDA(六). 从并行排序方法理解并行化思维——冒泡、归并、双调排序的GPU实现
- Java实现选择排序和冒泡排序执行时间的比较
- 数据结构各种排序法及核心思想(冒泡、鸡尾酒、选择、插入、二分法、希尔、堆、归并、快速)
- 关于排序(冒泡、选择、插入、快速)的几种算法