虽然用qsort(c)或者sort(c++)很方便,但做题时候,难免遇到需要用排序算法的情况,排序算法除了桶排序等,其余大多是利用数据的逆序对来排序,而桶排序是利用数据本来的顺序。以下下是利用比较大小来排序的,这种类型还有一个希尔排序没有提到,将添加后面不用比较大小的内容。
所谓冒泡,就想鱼吐泡泡,从小往大,交换相邻两个
每一次循环,比较两个数的大小,都会将大的放在上面,小的放在下面,每次循环过后,最大的都会再顶端(因为大的是一直往上交换的), 最终实现从小到大排序。
时间复杂度为O(n^2),较大
代码如下
#include
using namespace std;
int arr[100];
int n;
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
for (int i = 0; i < n-1 ; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
return 0;
}
第一个for循环是表示遍历的次数,因为每次遍历,最大 的都会成功在最上面,因此只要遍历n-1次数。
第二个循环是用来判断相邻的两个数大小,交换大小,每次遍历完成,最上面都要减一个数不用遍历所以要减去n,减一是为了防止溢出。
将第一个数与后面的数比较大小,然后交换两个数的位置,如何交换,要看题目要求,看需要的排列方式
遇到比arr[i]小的就交换,从而实现,逐步将最小的放在最后
#include
#include
using namespace std;
int arr[100];
int n;
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
for(int i=0;i
同样,第一个循环,是遍历整个数组。
第二个循环是寻找每次剩余数组中最小的数,然后与i对应的数交换。
选择第一个数为初始,与后面的数比较,按照要求插入位置
最终形成有序数组
#include
using namespace std;
int arr[100];
int n;
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
for(int i=1;i=0 && arr[j]>key){
arr[j+1]=arr[j];
//要注意这里是j+1,而不是key
//交换一次后,该数还要与前面的数字比较,从而形成有序数。
arr[j]=key;
j--;
}
}
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
return 0;
}
这样两次循环,创造一个新的空间来存放是不是也算,找到最小的存进去,是不是也算插入?
#include
#include
using namespace std;
int arr[100];
int brr[100];
int n;
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
for(int i=0;iarr[j]){
flag=j;
}
}
brr[i]=arr[flag];
arr[flag]=INT_MAX;
}
for (int i = 0; i < n; i++) {
cout << brr[i] << " ";
}
return 0;
}
利用了递归的思想,将数据分为两半,在分别对半进行排序,最后用合在一起
由于i指向的数小,所以i向右边移动
重复进行此操作,直到两方都结束,若一方提前结束,只需移动未结束的指针
#include
#include
using namespace std;
int n;
int arr[1000];
int brr[1000];
void is_sort(int l,int r,int mid){//合并
int p=l,q=mid+1;
for(int i=l;i<=r;i++){
if(q>r||(p<=mid&&arr[p]>n;
for(int i=1;i<=n;i++){
cin>>arr[i];
}
my_sort(1,n);
for(int i=1;i<=n;i++){
cout<
时间复杂度O(n*log2 n)
字如其名,和他的名字一样,就是排的很快,c中的qsort,和c++中的sort函数就是利用了快速排序
这里给大家分享b站的视频讲解思路,我觉得超详细,可以看看前面的物理演示的思路,我就不画图了
【全网最清晰快速排序,看完快排思想和代码全部通透,不通透你打我!】https://www.bilibili.com/video/BV1vP411g7J3?vd_source=2fcf7367e8561bbd9bb9fedd353732e5
快速排序也利用了递归的思想,巧妙利用了基准和双指针,刚学排列的时候看过,当时没写出来。
视频里的是以首元素为基准,我这里写的是以中间元素为基准,代码中有标注。
#include
#include
using namespace std;
int arr[1000];
int n;
void quick_sort(int l,int r){
int i=l,j=r;
int mid=(l+r)/2;
while(i<=j){
if(arr[i]arr[mid]) j--;//找到右边第一个比基准小的数
if(i<=j){//不能少,不然会超时
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
i++,j--;//交换后指针要自动指向下一位
}
}
if(l>n;
for(int i=1;i<=n;i++){
cin>>arr[i];
}
quick_sort(1,n);
for(int i=1;i<=n;i++){
cout<
制作不易,求个三连