zoukankan      html  css  js  c++  java
  • 排序(冒泡,快排,归并)

    一,冒泡排序(n^2)

    for(int i=2;i<=n;i++)j在前,i在后
        for(int j=1;j<=n-i;j++)
                if(a[j]<a[i])
                   swap(a[i],a[j]);

    二:快速排序(n*logn~n^2)用在随机数的情况下

    #include<iostream>
    
    using namespace std;
    int a[(int)1e5+5];
    void quick_sort(int q[],int l,int r)//先排序再递归
    {
        if(l>=r)return;
        int x=q[l],i=l-1,j=r+1;//如此定义i和j是使l和r也加入到排序中; 
        while(i<j)//这里是小于,使得最后i和j相等
        {
            do i++;while(q[i]<x);
            do j--;while(q[j]>x);
            if(i<=j)//这里要注意实际题目中的应用
                swap(q[i],q[j]);
        }
        quick_sort(a,l,j);
        quick_sort(a,j+1,r);
    }
    int main ()
    {
         int n;
         cin>>n;
         for(int i=1;i<=n;i++)
            cin>>a[i];
         quick_sort(a,1,n);
         for(int i=1;i<=n;i++)
            cout<<a[i]<<' ';
    
        return 0;
    }

    三:归并排序(nlogn)当相邻区间原先有大小关系时时间复杂度一般是O(n)

    #include<iostream>
    
    using namespace std;
    
    int a[(int)1e5+5],tmp[(int)1e5+5];
    void merge_sort(int q[],int l,int r)
    {
        if(l>=r)return ;
        int mid=l+r>>1;
        merge_sort(q,l,mid),merge_sort(q,mid+1,r);
        int k=0,i=l,j=mid+1;
        while(i<=mid&&j<=r)
        if(q[i]<q[j])tmp[k++]=q[i++];
        else tmp[k++]=q[j++];
        while(i<=mid)tmp[k++]=q[i++];
        while(j<=r)tmp[k++]=q[j++];
        for(int i=l,j=0;i<=r;j++,i++)q[i]=tmp[j];//容易出错,tmp数组的范围是从0开始,而q是从l到r
    }
    int main()
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        merge_sort(a,1,n);
        for(int i=1;i<=n;i++)
            cout<<a[i]<<' ';
        return 0;
    }
  • 相关阅读:
    编程习题05
    java初始化顺序
    项目开发问题
    hibernate相关知识
    工作使用到的SQL语句
    对于时间的灵活操作
    StringBuffer 和 StringBuilder的区别
    在WebService中处理IP地址
    使用web创建监听器
    工作笔记系列-学习的零零碎碎的技术
  • 原文地址:https://www.cnblogs.com/zwx7616/p/10987588.html
Copyright © 2011-2022 走看看