排序入门(冒泡,快排,归并)

好久之前整理的了,再看一眼发出来。

 

目录

 

冒泡排序:

快排:

归并排序:


冒泡排序:

for(int i=0;i<n;i++){
    for(int j=0;j<n-1-i;j++){
        if(a[j]>a[j+1]){
            int t=a[j];
            a[j]=a[1+j];
            a[j+1]=t;        
        }    
    }
}

Problem Detail - 车厢重组 - 追梦算法网

快排:

冒泡的速度比较慢,如何提速这里就要用到快排,

代码如下:(从小到大排序)

void quicksort(int l,int r){
      if(l>=r) return;
      int i=l-1,j=r+1,x=a[(l+r+1)/2];//当然这里可以写成(l+r+1)>>1;
      while(i<j){                 //从大到小
         do i++;while(a[i]<x);// a[i]>x;
         do j--;while(a[j]>x);// a[j]<x;
         if(i<j){
        int t=a[i];
        a[i]=a[j];
        a[j]=t;
  }
}
    //digui
 quicksort(l,i-1);
 quicksort(i,r);
}

快排_哔哩哔哩_bilibili

#include <stdio.h>
#include <stdlib.h> 
int compare(const void*b1,const void *b2){
    int num1=*(int*)b1;
    int num2=*(int*)b2;
    if(num1>num2) return 1;
    else if(num1<num2) return -1;//其实1和-1在程序中都表示TRUE
    else return 0;               //只有0才表示FALSE;
   
}
int main(){
 int t,a[100005];
 scanf("%d",&t);
 for(int i=0;i<t;i++){
     scanf("%d",&a[i]);
 }
   
     qsort(a,t,sizeof(int),compare);//compare 就是一个规定这个数据怎么排列的函数
     for(int i=0;i<t;i++){
         printf("%d ",a[i]);
     }

return 0;
}

归并排序:

说起这个,这两者的思想区别不是很大,但是快排他是一个不稳定的排序,

例如现在有一个 2 4 5 1 8 9 5 5 7 4 这样的数组要你排序,第二个“5”和第三个“5”的位置可在排序的过程发生互换,就可能出现:

1 2 4 4 5(1st) 5(3rd) 5(2nd) 7 8 9

1 2 4 4 5(3rd) 5(2nd)5(1st) 7 8 9

1 2 4 4 5(1st) 5(2nd) 5(3rd) 7 8 9

...

所以才有了归并排序:

代码如下:

void merge_sort(int l,int r){
    if(l>=r) return;
    int mid=(l+r)>>1; 
    merge_sort(l,mid);
    merge_sort(mid+1,r);
    int k=0,i=l,j=mid+1;
    while(i<=mid&&j<=r){
        if(a[i]<=a[j]) b[k++]=a[i++];
        else {b[k++]=a[j++];}
    }
    while(j<=r)   b[k++]=a[j++];
    while(i<=mid) b[k++]=a[i++];
    for(int i=0,j=l;j<=r&&i<k;i++,j++){
        a[j]=b[i];
    }

给个题:题目详情 - E.小U给你出道签到题 - 追梦算法网 (mangata.ltd)

这是我的死磕的记录,因为没初始化,所以一直是错的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值