zoukankan      html  css  js  c++  java
  • C++归并算法

    #include <iostream>
    using namespace std;
    
    void DealWhat(int ar[],int start,int end,int b[])
    {
        int mid = (start + end) / 2;    
        int i = start;
        int j = mid+1;
        int k = start;
        //将start到end区间划分为两个部分。对这两个部分进行合并排序。每一个部分应该是有序的。由于我们是从一个数字開始排序,
        //直到多个数字的排序,所以部分一定是有序的,逆向逐渐有序。

    while (i <= mid && j <= end) { if (ar[i] > ar[j]) { b[k++] = ar[j]; j++; } else { b[k++] = ar[i]; i++; } } while (i <= mid) { for (; i <= mid; i++) { b[k++] = ar[i]; } } while (j <= end) { for (; j <= end; j++) { b[k++] = ar[j]; } }//以上是合并排序。 k = 0; for (int m = start; m <= end; m++) { ar[m] = b[m];//ar数组的值也应该对应的变化。由于在start到end之间已经排序好了,我们仅仅须要将排序好的覆盖ar数组上面去。 //为下次递归排序做准备工作。 } } void Grial(int ar[],int start,int end,int b[]) { if (start >= end)return; int mid = (start + end) / 2;//每次取1/2递归深入。

    Grial(ar, start, mid ,b);//左边。 Grial(ar,mid+1, end,b);//右边。 DealWhat(ar,start, end,b);//处理函数,直到递归到单个数字。

    } int main() { int a[] = {100,2,3,1,99,32,4,11,324,0}; int *b = new int[10]; Grial(a,0,9,b); for (int i = 0; i < 10; i++) { cout << b[i]<<" " ; } cout << endl;//事实上这一步数组b到这个地方就能够delete了,由于数组a也随着排序改变。借助b这个辅助空间 //间接的排序原来的数组,本来能够不须要在外面传递b,只是我也不想改动了。 for (int i = 0; i < 10; i++) { cout << a[i]<<" "; } cout << endl; return 0; }

    感悟:
    思想的重要性,假设你的思想没有在你编程时产生火焰,即使你对别人
    思想理解的再深刻,终究仅仅是别人的东西。时间一长,你就会发现你已经
    被这些看似光芒四射的东西所奴役。就会越来越累。

    哈哈,拙见,一起努力。

  • 相关阅读:
    作业8: 软件工程学习总结
    用户体验——南通大学教务学生管理系统
    “构建之法互动游戏”感想
    第二次作业
    音乐播放器的发展演变
    C++用法的学习心得
    一、最后一次作业:软件工程学习总结
    设计一款给爸爸妈妈用的手机
    附加题1—— 我想搞懂的软工问题
    计算机病毒软件的发展演变
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7015933.html
Copyright © 2011-2022 走看看