今天讲快速排序(^_^)
一.各种排序
1.选择排序
(1)原理
不断将关键字中最小或最大的元素排到第一个,直到排完。
(2)过程
例:
初始: 4 2 5 1 6 8 9 3 7
第1次排序: 1 2 5 4 6 8 9 3 7
第2次排序: 1 2 5 4 6 8 9 3 7
第3次排序: 1 2 3 4 6 8 9 5 7
第4次排序: 1 2 3 4 6 8 9 5 7
第5次排序: 1 2 3 4 5 8 9 6 7
第6次排序: 1 2 3 4 5 6 9 8 7
第7次排序: 1 2 3 4 5 6 7 8 9
第8次排序: 1 2 3 4 5 6 7 8 9
第9次排序: 1 2 3 4 5 6 7 8 9 ☑
(3)代码
#include<bits/stdc++.h>
using namespace std;
int a[10000];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
int minn=1000000;
int k;
for(int j=i;j<=n;j++)
{
if(a[j]<minn)
{
minn=a[j];
k=j;
}
}
swap(a[i],a[k]);
}
for(int i=1;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<a[n];
return 0;
}
2.sort排序
(1)原理
这个没什么好说的,就是C++的基本公式(省时间复杂度)
(2)头文件
#include<algorithm>,不过我推荐#include<bits/stdc++.h>(万能头文件)
(3)代码
#include<bits/stdc++.h>
using namespace std;
int a[10000];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1,less<int>());/*正序less<int>(),倒序greater<int>()*/
for(int i=1;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<a[n];
return 0;
}
3.冒泡排序
(1)原理
将相邻的两个数比较看是不是逆序对,如果是逆序对将他们的值互换
(2)过程
例:
初始: 5 6 3 4 1 2
第1次排序: 6 5 3 4 1 2
第2次排序: 6 5 4 3 1 2
第3次排序: 6 5 4 3 2 1 ☑
(3)代码
#include<iostream>
using namespace std;
int t,a[105];
int main()
{
int n;
cin>>n;
for (int i=1; i<=n; ++i)
cin>>a[i];
for (int j=1; j<=n-1; ++j)
for (int i=1; i<=n-j; ++i)
if (a[i]<a[i+1])
{
swap(a[i],a[i+1];
}
for (int i=1; i<=n; ++i)
cout<<a[i]<<" ";
return 0;
}
4.桶排序
(1)原理
将原来给定的值放入原来就准备好的有顺序的桶中,再去循环桶,看桶里有没有值,如果有就输出。
(2)优缺点
优点:(省时间复杂度)
缺点:(小数不行,数据太大不行,负数也不行)
(3)代码
#include<bits/stdc++.h>
using namespace std;
int a[10000];
int s[10000];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
s[a[i]]++;
}
for(int i=1;i<=100;/*这里的100根据题目限制的上限而定*/i++)
{
if(s[i]>0)
{
for(int j=1;j<=s[i];j++)
{
cout<<i<<" ";
}
}
}
return 0;
}
5.插入排序
(1)原理
再循环到任意一个关键字的时候,将这个关键字插入合适的位置
(2)过程
例:
初始: [5] 6 3 4 1 2
第1次排序: [5 6] 3 4 1 2
第2次排序: [3 5 6] 4 1 2
第3次排序: [3 4 5 6] 1 2
第4次排序: [1 3 4 5 6] 2
第5次排序: [1 2 3 4 5 6] ☑
(3)代码
#include<bits/stdc++.h>
using namespace std;
int a[10000];
int main()
{
int n;
cin>>n;
int i,j,k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
for(j=i-1;j>=1;j--)
{
if(a[j]<=a[i])
{
break;
}
}
if(j!=i-1)
{
int o=a[i];
for(k=i-1;k>j;k--)
{
a[k+1]=a[k];
}
a[k+1]=o;
}
}
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
6.快速排序
(1)原理
冒泡排序的改进,用上了递归
(2)优点
(省时间复杂度)
(3)代码
#include<iostream>
using namespace std;
void qsort(int,int);
int a[101];
int main()
{
int n,i;
cin>>n;
for (i=1;i<=n;i++)
cin>>a[i];
qsort(1,n);
for (i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}
void qsort(int l,int r)
{
int i,j,mid,p;
i=l;j=r;
mid=a[(l+r)/2];
do
{
while(a[i]<mid) i++;
while(a[j]>mid) j--;
if(i<=j)
{
p=a[i];a[i]=a[j];a[j]=p;
i++;j--;
}
}while(i<=j);
if(l<j)qsort(l,j);
if(i<r)qsort(i,r);
}
二.结尾
这里提供了多种的排序方法,大家择题目而定
我将会持续更新算法内容,点赞,散会。