Sort(啊哈算法)

来源:互联网 发布:蜂群算法代码 编辑:程序博客网 时间:2024/06/01 11:43

桶排序

/** 给定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; }

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

0 0