ACM学习<3>

 

排序算法:

     

     基本:冒泡,快速,选择,堆,插入,shell

     多路并归:
1.冒泡排序:

     思想:交换排序,通过相邻的交换来达到排序的目的。

     流程:

          1.对数组中的各数据,依次比较相邻两个元素的大小。

          2.如果前面的大,交换。经过一轮,可把最小的排好。

          3.然后用同样的方法,把剩下的数据排好。最后从小到大排好相应的数据。

#include <iostream>
#include <time.h>
#define SIZE 10
using namespace std;
void BubbleSort(int *a,int len)
{
     int temp;
     for(int i=0;i<len-1;i++)
     {
          for(int j=len-1;j>i;j--)
          {
               if(a[j-1]>a[j])
               {
                    temp=a[j];
                    a[j]=a[j-1];
                    a[j-1]=temp;
               }
          }
          cout<<i<<":";
          for(int k=0;k<len;k++)
          {
               cout<<a[k]<<" ";
          }
          cout<<endl;
     }
}
int main()
{
     int shuzu[SIZE];
     srand(time(NULL));//随机种子
     for(int i=0;i<SIZE;i++)
     {
          shuzu[i]=rand()/1000+100;
     }
     cout<<"old:";
     for(int i=0;i<SIZE;i++)
     {
          cout<<shuzu[i]<<"  ";
     }
     cout<<endl;
     BubbleSort(shuzu,SIZE);
     cout<<"now:";
     for(int i=0;i<SIZE;i++)
     {
          cout<<shuzu[i]<<"  ";
     }
     cout<<endl;

}

 

选择排序:

     

     思路:在每一步选取最小的来重新排列。

     流程:

          1.首先从原始数据中选中最小的一个,和位于第一个位置的数据交换、

          2.接着从剩下的n-1数据中选择次小的,与第二个位子交换。

          3.这样重复,数组从小到大排列。

#include <iostream>
#include <time.h>
using namespace std;
#define SIZE 10
void SelectionSort(int *a,int len)
{
     int temp,k;
     for(int i=0;i<len-1;i++)
     {
          k=i;
          for(int j=i+1;j<len-1;j++)
          {
               if(a[j]<a[k])
                    k=j;
          }
          if(k!=i)//交换
          {
               temp=a[k];
               a[k]=a[i];
               a[i]=temp;
          }
     }
}
int main()
{
      int shuzu[SIZE];
      srand(time(NULL));
      for(int i=0;i<SIZE;i++)
      {
           shuzu[i]=rand()/1000+100;
      }
      cout<<"old:";
       for(int i=0;i<SIZE;i++)
      {
               cout<<shuzu[i]<<" ";
      }
      cout<<endl;
      SelectionSort(shuzu,SIZE);
      cout<<"now:";
      for(int i=0;i<SIZE;i++)
      {
           cout<<shuzu[i]<<" ";
      }
      cout<<endl;
}

 

插入排序:

     思路:通过未排序的数据逐个插入合适的位置来完成工作。

     流程:

          1.首先对数组的前两个数据进行从小到大排序

          2.接着第3个数据插入合适的位子

          3.第4个

          4.重复

 

#include <iostream>
#include <time.h>
#define SIZE 10
using namespace std;
void InsertionSort(int *a,int len)
{
     int temp,j,i,k;
     for(i=1;i<len;i++)
     {
          //temp=a[i],a[j+1]=a[j];a[j+1]=temp;就是个交换。 判断 j-- 为逻辑
          temp=a[i],
          j=i-1;
          while(j>=0 && temp<a[j])
          {
               a[j+1]=a[j];
               j--;
          }
          a[j+1]=temp;
     }
}
int main()
{
       int arr[SIZE];
        srand(time(NULL));
        for(int i=0;i<SIZE;i++)
        {
             arr[i]=rand()/1000+100;
          }
          cout<<"old:";
          for(int j=0;j<SIZE;j++)
        {
             cout<<arr[j]<<"  ";
          }
          cout<<endl;
          InsertionSort(arr,SIZE);
          cout<<"now:";
          for(int k=0;k<SIZE;k++)
        {
             cout<<arr[k]<<"  ";
          }
          cout<<endl;
}

 

    Shell排序:(希尔排序,缩小增量排序)

     流程

          1.将有n个元素的数组,分成n/2个数字序列。第一个数据和第n/2+1成一对、。。。

          2.一次循环是每个序列对排好顺序

          3。然后,在变为n/4

          4.不断重复。

#include <iostream>
#include <time.h>
using namespace std;
#define SIZE 10

void ShellSrot(int *a,int len)
{
     int i,j;
     int r,temp;
     for(r=len/2;r>=1;r/=2)
     {
          for(i=r;i<len;i++)
          {
               temp=a[i];
               j=i-r;
               while(j>=0&&temp<a[j])
               {
                    a[j+r]=a[j];
                    j-=r;
               }
               a[j+r]=temp;
          }
     }
}
int main()
{
        int arr[SIZE];
        srand(time(NULL));
        for(int i=0;i<SIZE;i++)
        {
             arr[i]=rand()/1000+100;
          }
          cout<<"old:";
          for(int j=0;j<SIZE;j++)
        {
             cout<<arr[j]<<"  ";
          }
          cout<<endl;
          ShellSrot(arr,SIZE);
          cout<<"now:";
          for(int k=0;k<SIZE;k++)
        {
             cout<<arr[k]<<"  ";
          }
          cout<<endl;
}
时间: 2024-09-13 19:24:50

ACM学习<3>的相关文章

ACM学习&lt;一&gt;

c++指针|指针入门   什么是指针? 其实指针就像是其它变量一样,所不同的是一般的变量包含的是实际的真实的数据,而指针是一个指示器,它告诉程序在内存的哪块区域可以找到数据.这是一个非常重要的概念,有很多程序和算法都是围绕指针而设计的,如链表. 开始学习 如何定义一个指针呢?就像你定义一个其它变量一样,只不过你要在指针名字前加上一个星号.我们来看一个例子: 下面这个程序定义了两个指针,它们都是指向整型数据. int* pNumberOne; int* pNumberTwo; 你注意到在两个变量名

ACM学习&lt;二&gt;

穷举算法思想:     一句话:就是从所有可能的情况,搜索出正确的答案. 步骤:     1.对于一种可能的情况,计算其结果.     2.判断结果是否满足,YES计算下一个,no继续步骤1,然后判断下个可能的情况. 实例:     孙子算经--鸡兔同笼:头35,脚94,几鸡几兔?           #include <iostream> //头文件 using namespace std; int qiongju(int head, int foot , int *chicken,int

写给大二想投入ACM的女生

[来信] 您好!我是学计算机的一名大二女生,大一基础学得不好,不注重专业学习,也不知道自己到底喜不喜欢这个专业,浑浑噩噩的就过去一年了,大二想补回来,说不清楚喜不喜欢,适不适合当程序员,但我觉得还是要好好学好专业知识,提高编程能力,在对它有更多的了解之后再判定这些纠结的问题. 最近加入了我们学院的ACM实验室,开始刷acm的基础题目,也想开始发表csdn博客,见证专业学习成长,分享经验心得,您对我在acm学习等方面有建议吗?您认为一个基础差的女生有必要对ACM投入时间吗?大二是很关键的一年,我自

ACM协会编程学习座谈的记录和思考

ACM协会的负责同学和我说,大一的同学不少说编程难学,想让我做个讲座.我说,让我讲多没意思,不如搞个座谈,让感觉困难的同学说说究竟是什么困难,有针对性地,老师.高年级同学,以及同年级克服了这些困难的同学,说说对策,相互启发.当然,我可以参加. 于是有了11月28日晚,在大活206的座谈.我还找了课程组负责人周老师,她也感兴趣去听听同学们的困难,一起想想办法.我通知了几个我带的班上学习已经进入轨道的同学(特意地安排有女生)去,好给大家传达点学习经验. 谁知,座谈的参加人员,十来个负责协会工作的大二

ACM算法数论学习

                               

CCAI 2017 | 邓小铁:金融博弈下的价值学习

在大会的智能金融论坛上,邓小铁教授发表了题为<金融博弈下的价值学习>的分享. 邓小铁现任上海交通大学计算机系致远讲席教授,曾获得清华大学工学学士学位.中国科学院硕士学位以及斯坦福大学博士,曾在英国利物浦大学.香港城市大学和加拿大约克大学任教. 在此之前, 他是西门弗雷泽大学的加拿大自然科学与工程技术研究理事会国际博士后研究员.因为对算法和博弈理论交互研究的贡献,于2008年获选ACM会士.2013年入选国家千人计划. 目前的重点研究算法博弈理论包括均衡分析和机制设计, 并应用于互联网经济学金融

细说循序渐进学习Ajax的途径

ajax 现在浏览器端以 JavaScript 为核心,基于各种 Web 标准(即:早已完成标准化的XHTML/CSS/DOM/XML/XSLT 和正在进行标准化的XMLHTTP)的技术正在加速整合,Ajax 就是这一系列技术的一个统称. 虽然网络上已经有大量的相关资源,但是为了打好基础,认真读上几本书还是很有必要的.好在 Ajax 并不是什么全新的技术,它仅仅是传统技术的发展和增值,是对于这些基于 Web 标准的传统技术的重新包装,使其更加适合于企业应用,并且和服务器端结合地更加紧密.因此学习

如何循序渐进学习Ajax教程?

ajax|教程 现在浏览器端以 JavaScript 为核心,基于各种 Web 标准(即:早已完成标准化的XHTML/CSS/DOM/XML/XSLT 和正在进行标准化的XMLHTTP)的技术正在加速整合,Ajax 就是这一系列技术的一个统称. 虽然网络上已经有大量的相关资源,但是为了打好基础,认真读上几本书还是很有必要的.好在 Ajax 并不是什么全新的技术,它仅仅是传统技术的发展和增值,是对于这些基于 Web 标准的传统技术的重新包装,使其更加适合于企业应用,并且和服务器端结合地更加紧密.因

循序渐进学习Ajax的途径

ajax 现在浏览器端以 JavaScript 为核心,基于各种 Web 标准(即:早已完成标准化的 XHTML/CSS/DOM/XML/XSLT 和正在进行标准化的 XMLHttpRequest)的技术正在加速整合,Ajax 就是这一系列技术的一个统称.  虽然网络上已经有大量的相关资源,但是为了打好基础,认真读上几本书还是很有必要的.好在 Ajax 并不是什么全新的技术,它仅仅是传统技术的发展和增值,是对于这些基于 Web 标准的传统技术的重新包装,使其更加适合于企业应用,并且和服务器端结合