您的位置:首页 > 编程语言 > Java开发

Java语言程序设计(十六)数组的查找与排序

2021-01-22 23:06 351 查看

 1.可变长参数列表

      我们可以把参数相同但个数可变的参数传递给方法,方法中的参数声明如下: type...parameterName(类型名。。。参数名),在方法声明中,指定类型后紧跟着省略号,只能给方法中指定一个可变长参数。任何常规参数必须在它之前,Java将可变长参数当成数组对待。可以将一个数组或可变的参数个数传递给可变长参数。

      2.数组的查找

      查找是在数组中寻找特定元素的过程,我们经常使用的方法有线性查找和二分查找。

      (1)线性查找法

      线性查找法将要查找的关键字key与数组中的元素逐个进行比较。这个过程持续到在列表中找到与关键字匹配的元素,或者查找完列表也没有找到关键字为止。如果匹配成功,线性查找法返回与关键字匹配的元素在数组中的下标。如果没有匹配成功,则返回-1,程序清单如下:

      public class LineSearch{

          public static int linearSearch(int[] list,int key){

              for(int i=0;i<list.length;i++){

                 if(key ==list[i])

                 return i;

                }

                return -1;

          }

}

      线性查找法把关键字和数组中的每一个元素进行比较,数组中的元素可以按照任意顺序排列,由于线性查找法的执行时间随着数组元素个数的增长而线性增长,所以对大数组而言,线性查找法的效率并不高。

      (2)二分查找法

      二分查找法是另一种常见的对数值列表的查找方法,使用二分查找法的前提是数组中的元素必须已经排好序,假设数组已经按照升序排列,二分查找法首先将关键字与数组的中间元素进行比较,考虑下面三种情况:如果关键字小于中间元素,只需要在数组的前一半元素中继续查找关键字即可。如果关键字和中间元素相等,则匹配成功,查找结束。如果关键字大于中间元素,只需要在数组的后一半元素中继续查找关键字,显然,二分法在每次比较之后,数组要查找的部分会缩小一半。

      我们从查找的第一次迭代开始,将关键字key和低下标low为0,高下标为list.length-1的数列的中间元素进行比较。如果key<list[mid],就将下标high设置为mid-1,如果key==list[mid],则匹配成功,返回mid,否则就将下标low设置为mid+1。如果找到这个关键字,或者当low大于high时还没有找到这个关键字,就结束这个查找,程序清单如下:

      public class BinarySearch[

          public static int binarySearch(int[] list,int key){

              int low =0;

              int high = list.length-1;

              while(high>=low){

              int mid = (low+high)/2;

              if(key<list[mid])

                  high =mid-1;

              else if(key == list[mid])

                  return mid;

              else

                   low = mid+1;

              }

          return -low-1;

          }

}

      方法返回-low-1,是因为这种方法不但说明关键字不再序列中,而且还给出了关键字应该插入的位置。

      3.数组的排序

       类似与查找,排序时计算机程序设计中的一个常用任务,我们本次介绍两中简单,只管的排序算法:选择排序法和插入排序法。

      (1)选择排序

      假设要按升序排列一个数列,选择排序先找到这个数列中的最小的数,然后把它放在数列的最前面,接下来在剩下的数中找到最小数,将他放到第一个数的后面,依次类推,直到数列中仅剩一个数为止。程序清单如下:

      public class SelectionSort{

          public static void selectionSort(double[]list){

              for(int i=0;i<list.length-1;i++){

              double currentMin = list[i];

              int currentMinIndex = i;

              for(int j =i+1;j<list.length;j++){

                  if(currentMin>list[j]){

                      currentMin = list[j];

                      currentMinIndex =j;

                  }

              }

               if(currentMinIndex!=i){

                      list[currentMinIndex]=list[i];

                      list[i] = currentMin;

                  }

                }

           }

}

      (2)插入排序    

        假设希望对一个数列进行递增排序,插入排序法的算法是在已经排好序的子数列中反复插入一个新元素来对数列值进行排序,直到整个数列全部排好序。程序清单:

      public class InsertionSort{

          public static void insertionSort(double[]list){

          for(int i=1;i<list.length;i++){

              double currentElement = list[i];

               int k;

               for(k=i-1;k>=0&&list[k]>currentElement;k--){

                   list[k+1]=list[k];

               }

               list[k+1]=currentElement;

               }

            }

}

    其中list[i]为要插入的新元素,为了将其插入list[0...i-1],我们先将list[i]存储在一个名为currentElement的临时变量中,如果list[i-1]>currentElement,就将list[i-1]移到list[i];如果ist[i-2]>currentElement,就将list[i-2]移到list[i-1],依次类推,直到list[i-k]<=currentElement或者k>i(传递的是排好序的数列的第一个元素)。将currentElement赋值给list[i-k+1],例如要将4插入{2,5,9}中,由于9大于4,所以把list[2](9)移到list[3],又因为5大于4,所以把list[1](5)移到list{2],最后把currentElement(4)移到list[1]。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐