1.区别
选择排序和冒泡排序的区别主要在于算法逻辑、稳定性和交换成本。
- 算法逻辑:选择排序和冒泡排序都属于比较排序,但在具体算法逻辑上有所不同。冒泡排序是通过相邻元素之间的比较和交换,将较大(或较小)的元素逐渐“冒泡”到数组的一端。选择排序则是先选择后交换,在一轮比较中,将最大(或最小)的元素与数组的末尾元素交换,然后在剩余的元素中继续选择和交换。
- 稳定性:冒泡排序是稳定的排序算法,即相等的元素的顺序不会改变。而选择排序是不稳定的排序算法,因为元素的相对顺序可能会在排序过程中发生改变。
- 交换成本:在交换成本方面,选择排序相较于冒泡排序有优势。冒泡排序需要相邻元素之间的比较和交换,而选择排序只需要记录下标,一轮比较结束后才进行数据的调换,因此选择排序的交换次数要少于冒泡排序。
总的来说,选择排序和冒泡排序各有其特点,需要根据具体需求和数据量来选择使用哪种排序算法。
public class ArrayTest {
public static void main(String[] args) {
MyTools mt = new MyTools();
int[] arr = {10, -1, 8, 0, 34};
mt.bubble(arr);
//输出快捷键sout
System.out.println("===冒泡排序后的arr===");
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
mt.selectionSort(arr);
System.out.print("\n");
System.out.println("===选择排序后的arr===");
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
}
}
//创建一个类MyTools,完成int数组升序排序的功能
class MyTools {
public void bubble(int[] arr) {
int temp = 0;
for(int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - 1 -i; j++) {
if(arr[j] > arr[j+1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
public void selectionSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
int minValIdx = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[minValIdx] > arr[j]) {
minValIdx = j;
}
}
int temp = arr[minValIdx];
arr[minValIdx] = arr[i];
arr[i] = temp;
}
}
}
运行结果: