「第8节」算法的基础知识(二)

大家好,上一节,我对算法的定义、分类、特点等方面进行了深入细致地讲解、分析。这一节,我们继续学习算法。我将根据上一节的分类,以实例为抓手,对
冒泡排序、二分查找这2种重要算法设计技术进行仔细讲解,以让大家对算法有个深入的了解。

「第8节」算法的基础知识(二)

「第8节」算法的基础知识(二)

(1)冒泡排序

定义:冒泡排序算法属于排序算法中的一种,是一种非常常见、非常实用的算法技术。

冒泡排序的基本理念是:反复遍历需要排序的数组。在每次遍历过程中,比较相邻的2个数,如果这2个数是按照降序的顺序排列的,就交换它们的顺序;如果这2个数是按照升序的顺序排列的,则保持不变。遍历的次数是不固定的,直到没有数需要交换时遍历结束,这时所有的数都按照从小到大排列了。由于此时较小的数像“气泡”一样逐渐“浮向”顶部,较大的数“沉到”底部,所以这种算法就被称为冒泡排序法。

「第8节」算法的基础知识(二)

用通俗语言,可以将该算法步骤描述如下:

第一步:比较第1个数和第2个数,如果前者比后者大,就交换它们的位置;否则,不变。

第二步:同第一步,对每一对相邻的数进行大小比较,直到最后一对数。

第三步:除了最后1个数,又从第1个数开始,重复第一步和第二步工作。

第四步:直到所有的数都没有交换的情况发生时,说明所有的数都从小到大排列了,则排序结束。

范例1:

public class BubbleSort {

public static void bubbleSort(int[] list){

boolean needNextPass= true;

for(int k=1;k<list.length&&needNextPass;k++){

needNextPass= false;

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

if(list[i] >list[i+1]){

int temp=list[i];

list[i]=list[i+1];

list[i+1]=temp;

needNextPass= true;

}

}

}

}

public static void main(String[] args) {

int[] list= {2,3,2,5,7,1,-8,19,6,10};

bubbleSort(list);

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

System.out.print(list[i]+ 〝 〞);

}

}

「第8节」算法的基础知识(二)

范例1在eclipse中的结果显示

范例讲解:该程序新建了一个bubbleSort()方法,调用这个方法需要调入list这个数组类型的参数。

首先,在主程序里面给list赋好值。

接着,调用bubbleSort()方法。先将boolean类型的数needNextPass赋初始值为true。

然后,是一个for循环(有关for循环将在以后章节深入讲解),for循环里面又嵌套一个for循环。通过这2个for循环,将数组中元素从小到大排列!

嵌套里面的for循环每一次运行结束,都会将数组中最大的元素移动到最右边。这样直到needNextPass为false(即没有元素交换的情况发生了)以及k>=list.length(即k值比list这个数组最大下标值都大了)时,2个for循环才结束。

最后,在主程序里面,又使用一个for循环将排好序的数组list打印显示出来。

(2)二分查找算法

定义:二分查找算法是查找算法当中的一种,是种非常重要的算法思想。它在一种在有序数组中查找某一特定元素的搜索算法。使用二分查找算法的前提条件是:数组中的元素事先已经排好序了(而且一般是递增)。

二分查找算法的基本理念是:从数组的中间元素开始搜索,如果中间元素刚好是要查找的元素(以下称为关键字),则搜素过程结束;如果关键字小于中间元素,就在数组的前一半元素中继续搜索,而且和开始一样从中间元素开始比较;如果关键字大于中间元素,就在数组的后一半元素中继续搜索,而且和开始一样从中间元素开始比较。

「第8节」算法的基础知识(二)

二分查找算法直到查找到所需的关键字即终止。它的每一次比较都使搜索范围缩小一半,相对于线性查找算法而言,它的效率要高出许多!

用通俗语言,可以将该算法步骤描述如下:

第一步:设低下标low初值为0,设高下标high初值为list.length-1(list.length为数组长度),中间元素下标为mid。

第二步:将关键字与数组中间元素进行比较,如果关键字等于中间元素,返回下标mid,结束搜索;如果关键字大于中间元素,就通过low=mid+1将mid+1的值赋给低下标,并从数组后一半元素中继续搜索;如果关键字小于中间元素,就通过high=mid-1将mid-1的值赋给高下标,并从数组前一半元素中继续搜索。

第三步:直到搜索到所需的关键字,二分查找的循环才结束,否则反复进行第二步工作,直至high

范例2:

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>

high=mid-1;

else if(key==list[mid])

return mid;

else

low=mid+1;

}

return -1;

}

public static void main(String[] args) {

int[] list= {2,3,5,11,16,19,23,42,48};

int key=23;

System.out.print(binarySearch(list,key));

}

}

「第8节」算法的基础知识(二)

范例2在eclipse中的结果显示

范例讲解:该程序新建了一个binarySearch()方法,调用这个方法需要调入list这个数组以及key这个数据2个参数。

首先,在主程序里面将list和key赋好初始值。

接着调用binarySearch()方法。在这个方法里面,给低下标low和高下标high赋好初始值。

然后,是一个while循环程序(有关while循环将在以后章节深入讲解)。这个循环程序直至high

在while循环程序里面,先将mid初值设为(low+high)/2。然后,当关键字key与数组中间元素list[mid]做比较。如果key等于list[mid],直接返回mid值,这时无论high;如果key大于list[mid],将mid+1赋值给low;如果key小于list[mid],将mid-1赋值给high。如果整个循环结束都没有找到关键字,就返回值-1。

最后,当有return值时,就在主程序中通过print()方法打印显示出来。

本节最后,还是给大家留一个编程小作业,大家要好好思考:

编写一个程序,首先从控制台输入10个double类型的数,再用冒泡排序的方法,将这10个数排好序,并打印显示出来。

/<list>


分享到:


相關文章: