• Java数据结构和算法之数组与简单排序


    一、数组于简单排序

      数组  

      数组(array)是相同类型变量的集合,可以使用共同的名字引用它。数组可被定义为任何类型,可以是一维或多维。数组中的一个特别要素是通过下标来访问它。数组提供了一种将有联系的信息分组的便利方法。

      一维数组

      一维数组(one‐dimensional array )实质上是相同类型变量列表。要创建一个数组,你必须首先定义数组变量所需的类型。通用的一维数组的声明格式是:  

      type var‐name[ ];  

      获得一个数组需要2步:

      第一步,你必须定义变量所需的类型。

      第二步,你必须使用运算符new来为数组所要存储的数据分配内存,并把它们分配给数组变量。

      这样Java 中的数组被动态地分配。如果动态分配的概念对你陌生,别担心,它将在后面详细讨论。

          数组的初始化(array initializer )就是包括在花括号之内用逗号分开的表达式的列表。逗号分开了数组元素的值。Java 会自动地分配一个足够大的空间来保存你指定的初始化元素的个数,而不必使用运算符new。   Java 严格地检查以保证你不会意外地去存储或引用在数组范围以外的值。Java 的运行系统会检查以确保所有的数组下标都在正确的范围以内(在这方面,Java 与C/C++ 从根本上不同,C/C++ 不提供运行边界检查)。

       多维数组

      在Java 中,多维数组(multidimensional arrays )实际上是数组的数组。你可能期望,这些数组形式上和行动上和一般的多维数组一样。然而,你将看到,有一些微妙的差别。定义多维数组变量要将每个维数放在它们各自的方括号中。例如,下面语句定义了一个名为twoD 的二维数组变量。

         int twoD[][] = new int[4][5];  

      简单排序  

      简单排序中包括了:冒泡排序、选择排序、插入排序;

      1.冒泡排序的思想:

         假设有N个数据需要排序,则从第0个数开始,依次比较第0和第1个数据,如果第0个大于第1个则两者交换,否则什么动作都不做,继续比较第1个第2个…,这样依次类推,直至所有数据都“冒泡”到数据顶上。  

      冒泡排序的的java代码:

      Public void bubbleSort(){

        int in,out;  

        for(out=nElems-1;out>0;out--){   

          for(in=0;in<out;in++){   

             If(a[in]>a[in+1]){     

              Swap(in,in+1);    

             }  

           }

         }

       }  

      算法的不变性:  许多算法中,有些条件在算法执行过程中始终是不变的。这些条件被称为算法的不变性,如果不变性不为真了,则标记出错了;

      冒泡排序的效率O(N*N),比较N*N/2,交换N*N/4;

       2. 选择排序的思想:

       假设有N条数据,则暂且标记第0个数据为MIN(最小),使用OUT标记最左边未排序的数据,然后使用IN标记第1个数据,依次与MIN进行比较,如果比MIN小,则将该数据标记为MIN,当第一轮比较完后,最终的MIN与OUT标记数据交换,依次类推;  选择排序的java代码:

      Public void selectSort(){

         Int in,out,min;  

         for(out=0;out<nElems-1;out++){  

             Min=out;  

             for(in=out+1;in<nElems;in++){    

                if(a[in]<a[min]){    

                   Min=in;     

                  Swap(out,min);    

                  }  

             }  

          }

       }  

      选择排序的效率:O(N*N),比较N*N/2,交换<N;  选择排序与冒泡排序比较,比较次数没有明显改变,但交换次数明显减少了很多;

      3. 插入排序的思想:  

      插入排序是在部分数据有序的情况下,使用OUT标记第一个无序的数据,将其提取保存到一个中间变量temp中去,使用IN标记空位置,依次比较temp中的值与IN-1的值,如果IN‐值大于temp的值,则后移,直到遇到第一个比temp小的值,在其下一个位置插入;  

      插入排序的java代码:  

      Public void InsertionSort(){  

         Int in,out;  

         for(out=1;out<nElems;out++){   

           long temp=a[out]    

          in=out;    

          While(in>0&& a[in-1]>temp){     

          a[in]=a[in-1];     

          --in;   

           }    

          a[in]=temp;   

        }

       }  

      插入排序的效率:O(N*N), 比较N*N/4,复制N*N/4;  

      插入排序在随机数的情况下,比冒泡快一倍,比选择稍快;  

      在基本有序的数组中,插入排序几乎只需要O(N);  

      在逆序情况下,并不比冒泡快;

  • 相关阅读:
    之三:CAAnimationGroup
    之二:CAKeyframeAnimation
    Core Animation
    swift基础语法(28- 继承与构造方法, 指定构造与便利构造方法)
    swift基础语法(26-继承,super关键字,override关键字,final关键字)
    swift基础语法(25- 下标subscripts)
    swift基础语法(24-方法,self关键字,mutating方法,类方法)
    swift基础语法(23- 属性,存储属性,延迟存储属性,计算属性,属性观察器,类属性)
    swift基础语法(22-类,类的恒等运算)
    swift基础语法(21-结构体,结构体构造器,定义成员方法)
  • 原文地址:https://www.cnblogs.com/amirsterry/p/3704150.html
Copyright © 2020-2023  润新知