一直以来老是容易把选择排序和冒泡排序混淆,这次通过debug跟踪程序总算是弄明白两者之间的差别了。先说说选择排序和冒泡排序最主要的区别。最主要的就一点,选择排序是在每次排序的时候找出最小(或最大)的那个元素,然后与假定的那个元素交换位置,但是在找出那个元素之前是不交换位置的。而冒泡排序是在每次排序的时候通过交换下一个元素的位置来找出最小(或最大)的那个元素,并同时安排好这个元素的位置。关键代码差别:
选择排序:
for(int i=...){
int min=i; //假定一个最小(或最大)元素下标
for(int j=...){
if(array[min]>array[j]){ //循环一次,在这次循环中找到最小(或最大)元素下标,min相当于一个指针,指向最小的那个元素
min=j;
}
}
}
冒泡排序:
for(int i=...){
for(int j=...){
if(array[j]>array[j+1]){ //相邻的两个元素比较,当满足条件时交换位置,注意这里只是相邻的两个元素两两交换位置
...;
}
}
}
这是两个排序最主要的区别所在。
选择排序的基本思想是:第一趟从n个元素的数据序列中选出关键字最小(或最大)的元素并放到最前(或最后)的位置,下一趟再从n-1个元素中选出最小(大)的元素并放到次前(后)的位置,经过n-1趟完成排序。
public static void selectSort(int array[]){
for(int i=0;i<array.length-1;i++){
int min=i;
for(int j=i+1;j<array.length;j++){
if(array[min]>array[j]){
min=j;
}
}
if(min!=i){
int temp=array[min];
array[min]=array[i];
array[i]=temp;
}
}
}
而冒泡排序的基本思想:比较相邻两个元素的关键字值,如果反序则交换。若按升序排序,每一趟将被扫描的数据序列中的最大元素交换到最后位置。
public static void bubbleSort(int array[]){
for(int i=0;i<array.length-1;i++){
for(int j=0;j<array.length-i-1;j++){
if(array[j]>array[j+1]){
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
}
选择排序和冒泡排序在代码上有个很大的区别,就是在交换数据的时候,选择排序是在第一层for循环,而冒泡排序是在第二层for循环。