前言
想必大家都知道排序算法是一个很重要的算法,但有时候你可能会记不起来,所以我带着大家把排序算法最基础的几种算法写一下吧!
参照组如下
int a[10]={10,32,34,67,86,45,24,16,9,27};
冒泡排序
原理:将大的数沉下去,将小的数慢慢上升。
平均时间复杂度:O(n^2),最优时间复杂度:O(n^2),最坏时间复杂度:O(n^2)
const int n=10;
void bubblesort(){
for(int i=0;i<n;i++){
for(int j=0;j<n-i-1;j++){
if(a[j]>a[j+1]){
swap(a[j],a[j+1]);
}
}
for(int k=0;k<n;k++){
cout<<a[k]<<" ";
}
cout<<endl;
}
}
结果如下:
10 32 34 67 86 45 24 16 9 27
10 32 34 67 45 24 16 9 27 86
10 32 34 45 24 16 9 27 67 86
10 32 34 24 16 9 27 45 67 86
10 32 24 16 9 27 34 45 67 86
10 24 16 9 27 32 34 45 67 86
10 16 9 24 27 32 34 45 67 86
10 9 16 24 27 32 34 45 67 86
9 10 16 24 27 32 34 45 67 86
选择排序
原理:从i+1开始选,进行打擂法,选出最小值的下表,和第i个交换。
平均时间复杂度:O(n^2),最优时间复杂度:O(n^2),最坏时间复杂度:O(n^2)
const int n=10;
void selectsort(){
for(int i=0;i<n;i++){
int h=i;
for(int j=i+1,j<n;j++){
if(a[j]<a[h]){
h=j;
}
}
swap(a[i],a[h]);
for(int k=0;k<n;k++){
cout<<a[k]<<" ";
}
cout<<endl;
}
}
结果如下:
10 32 34 67 86 45 24 16 9 27
9 10 32 34 67 86 45 24 16 27
9 10 16 32 34 67 86 45 24 27
9 10 16 24 32 34 67 86 45 27
9 10 16 24 27 32 34 67 86 45
9 10 16 24 27 32 34 67 86 45
9 10 16 24 27 32 34 67 86 45
9 10 16 24 27 32 34 45 67 86
9 10 16 24 27 32 34 45 67 86
9 10 16 24 27 32 34 35 67 86
插入排序
原理:插入排序是将前面的序列看成已经排好序的,将后面的数字插入到对应的位置。
平均时间复杂度:O(n^2),最优时间复杂度:O(n^2),最坏时间复杂度:O(n^2)
const int n=10;
void insertsort(){
for(int i=1;i<n;i++){
int ps=i-1;
int cur=a[i];
while(ps>=0&&cur<a[ps]){
a[ps+1]=a[ps];
ps--;
}
a[ps+1]=cur;
for(int k=0;k<n;k++){
cout<<a[k]<<" ";
}
cout<<endl;
}
}
结果如下:
10 32 34 67 86 45 24 16 9 27
10 32 34 67 86 45 24 16 9 27
10 32 34 67 86 45 24 16 9 27
10 32 34 67 86 45 24 16 9 27
10 32 34 45 67 86 24 16 9 27
10 24 32 34 45 67 86 16 9 27
10 16 24 32 34 45 67 86 9 27
9 10 16 24 32 34 45 67 86 27
9 10 16 24 27 32 34 45 67 86
归并排序
原理:思想是将数组二分成一段一段的数组,然后将分段的数组分别排序,然后在合并成有序的数组。
平均时间复杂度:O(nlogn),最优时间复杂度:O(nlogn),最坏时间复杂度:O(nlogn)
const int n=10;
void Merge(int L,int mid,int R){
int n1=mid-L+1;
int n2=R-mid;
vector<int> t1;
vector<int> t2;
for(int i=0;i<n1;i++){
t1.push_back(a[L+i]);
}
for(int i=0;i<n2;i++){
t2.push_back(a[mid+i+1]);
}
int k=L;
int i=0,j=0;
while(k<=R){
if(i<n1&&j<n2){
if(t1[i]<t2[j]){
a[k]=t1[i];
i++;
}
else{
a[k]=t2[j];
j++;
}
k++;
}
else{
while(i<n1&&k<=R){
a[k]=t1[i];
i++;
k++;
}
while(j<n2&&k<=R){
a[k]=t2[j];
j++;
k++;
}
}
}
}
void Mergesort(int L, int R){
if(L<R){
int mid=(L+R)/2;
Mergesort(L,mid);
Mergesort(mid+1,R);
Merge(L,mid,R);
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
}
结果如下:
10 32 34 67 86 45 24 16 9 27
10 32 34 67 86 45 24 16 9 27
10 32 34 67 86 45 24 16 9 27
10 32 34 67 86 45 24 16 9 27
10 32 34 67 86 24 45 16 9 27
10 32 34 67 86 16 24 45 9 27
10 32 34 67 86 16 24 45 9 27
10 32 34 67 86 9 16 24 27 45
9 10 16 24 27 32 34 45 67 86