Sort(啊哈算法)

桶排序

/** 给定5个同学的分数,按照从大到小的顺序排序

  • 桶排序

  • 时间复杂度:O(M+N)

  • 缺点:浪费空间

    */

int main(){

/****************5***************/
int a[11];
for(int i=0; i<=10; i++){
    a[i] = 0; //初始化为0 
}

for(int i=0; i<5; i++){ //循环读入5个数 
    int t;
    cin >> t;
    a[t]++;   //进行计数 
}
for(int i=10; i>=0; i--){
    for(int j=1; j<=a[i]; j++){
        cout << i << " "; 
    }
}
cout << endl;

/****************1000****************/ 
int book[1001],i,j,t,n;
for(i=0; i<=1000; i++){ //循环m次,m为桶的个数 
    book[i] = 0;
}

scanf("%d", &n);//输入一个数n,表示接下来有n个数
for(i=1; i<=n; i++){//循环读入n个数,并进行桶排序,循环了n次(n为待排序数的个数) 
    scanf("%d", &t); 
    book[t]++; //进行计数,对编号为t的桶放一个小旗子
}

for(i=1000; i>=0; i--){ //一共循环了m+n 次
    for(j=1; j<=book[i]; j++){ //
        printf("%d ", i);
    }
}
cout << endl;

return 0;   

}

冒泡排序

/** 给定5个同学的分数,按照从大到小的顺序排序

  • 冒泡排序

  • 时间复杂度:O(N^2)

  • 缺点:双重嵌套循环,执行效率低

    */

    写法(1) :

    for(int i=1; i<=n; i++){
         cin >> a[i];
     }
    for(int i=1; i<=n-1; i++){ //n个数排序,只用进行n-1趟
    for(int j=1; j<=n-i; j++){ //第1位开始比较直到最后一个尚未归位的数
        if(a[j] < a[j+1]){
            int t = a[j];
            a[j] = a[j+1];
            a[j+1] = t;
        }
    }
    

    写法(2) :

    for(int i=0; i<4; i++){  //比较n-1次 
        for(int j=i+1; j<5; j++){
            if(a[i] < a[j]){
                int temp = a[i];
                a[i] = a[j];
                a[j] = temp;
           }
        }
    }
    

快速排序

/** 快速排序

  • 时间复杂度:O(NlogN),最坏为O(N^2)

  • 基于二分思想

    */
    啊哈算法:示例算法流程图

      int a[101];
      int n;   //定义全局变量,这两个变量需要在子函数中使用 
      void quickSort(int left, int right){
          int i,j,t,temp;
          if(left > right) return;
    
          temp = a[left]; //temp中存的是基准数
          i = left;
          j = right; 
          while(i != j){
         //顺序很重要,要先从右往左找
              while(a[j]>=temp && i<j){
                  j--;
              }
        //再从左往右找
             while(a[i]<=temp && i<j){
                  i++;
             } 
    
       //交换两个数在数组中的位置
             if(i < j){
                 t = a[i];
                 a[i] = a[j];
                 a[j] = t;
             } 
      }
      //最终将基准数归位,i、j相同时的位置即为基准数需要的位置 
       a[left] = a[i];
       a[i] = temp;
    
       quickSort(left, i-1); //继续处理左边的序列,此处为递归 
       quickSort(i+1, right); //继续处理右边的序列,此处为递归 
    }
    
    
    int main(){
        int i,j,t;
        cin >> n;
        for(i=0; i<n; i++){
            cin >> a[i];
        }
        quickSort(0, n-1);  //调用快排
    
       for(i=0; i<n; i++){
           cout << a[i] << " ";
       } 
       cout << endl;
    
       return 0;
     }
    

以上三个算法为啊哈算法中所介绍的算法,之后会持续更新所学习到的算法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值