文章目录
O( n*n )算法
冒泡排序
算法思路
两两比较,将两者较少的升上去,第一次比较下标范围为0到(N-1),最后一轮比较空间为0到1
算法实现
可以看到,在此次运行中,把一万个数据排序,需要花674ms。
//冒泡排序
#include<iostream>
#include<time.h>
#include <iomanip>
#include<stdlib.h>
using namespace std;
const int N = 10000;
int a[N+5];
int main(){
srand(time(NULL));
clock_t startTime,endTime;
//赋初值
for(int i = 0;i < N;i++){
a[i] = rand()%N;
}
//排序
startTime = clock();
for(int i = N-2; i >= 1;i--){
//枚举比较的终点
for(int j = 0; j <= i;j++){
if(a[j]>a[j+1]) swap(a[j],a[j+1]);
}
}
endTime = clock();
//查看排序结果
for(int i = 0;i < N;i++){
cout<<setw(9)<<a[i];
}
cout<<endl<<"运行时间是"<<endTime - startTime<<"ms"<<endl;
return 0;
}
算法分析
因为大量的swap函数,所以在时间复杂度上和选择排序一样,但是所耗时间更多(674ms)。
选择排序
算法思路
在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换……第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成。
算法实现
//选择排序
#include<iostream>
#include<time.h>
#include <iomanip>
#include<stdlib.h>
using namespace std;
const int N = 10000;
int a[N+5];
int main(){
srand(time(NULL));
clock_t startTime,endTime;
//赋初值
for(int i = 0;i < N;i++){
a[i] = rand()%N;
}
//排序
startTime = clock();
for(int i = 0; i <= N-1;i++){
//枚举比较的终点
int minA = a[i],minPos = i;
for(int j = i+1; j <= N-1;j++){
if(a[j]<minA){
minA = a[j],minPos = j;
}
}
swap(a[i],a[minPos]);
}
endTime = clock();
//查看排序结果
for(int i = 0;i < N;i++){
cout<<setw(9)<<a[i];
}
cout<<endl<<"运行时间是"<<endTime - startTime<<"ms"<<endl;
return 0;
}
算法分析
因为用了较少的swap,时间和冒泡排序有所降低(155ms)。
插入排序
算法思路
插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增 1 的有序表。
算法实现
//归并排序
#include<iostream>
#include<time.h>
#include <iomanip>
#include<stdlib.h>
using namespace std;
const int N = 10000;
int a[N+5];
void insertSort(int left,int right){
for(int i = 1;i <= right+1;i++){
//i为已排序的长度
for(int j = i-1;j>=0;j--){
if(a[j-1] > a[j]) swap(a[j-1],a[j]);
else break;
}
}
}
int