开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天,点击查看活动详情
选择排序
排序规则,给出一个无序数组,按从小到大的顺序进行排列。
选择排序,简单的讲就是在这一组数据中,依次选择出最小的元素进行排列。
排序原理
假如数组长度为N,第一次从 0 ~ N - 1 位置寻找一个最小值,然后与0位置的数进行交换;第二次从1 ~ N - 1位置寻找一个最小值,然后与1位置的数进行交换;依此类推,直到把整个数组都进行了排序。
给定一组数据:
3, 5, 2, 7, 13, 8, 1, 9, 12
第1次,从第1位开始,找出这组数据中的最小值与第1个数进行交换,即数字1与数字3进行交换,交换完的数据为:1, 5, 2, 7, 13, 8, 3, 9, 12。
第2次,从第2位开始,找出剩余数据中的最小值与第2个数进行交换,即数字2与数字5进行交换,交换完的数据为:1, 2, 5, 7, 13, 8, 3, 9, 12。
第3次,从第3位开始,找出剩余数据中的最小值与第3个数进行交换,即数字3与数字5进行交换,交换完的数据为:1, 2, 3, 7, 13, 8, 5, 9, 12。
......
第8次,从第8位开始,找出剩余数据中的最小值与第8个数进行交换,即数字3与数字5进行交换,交换完的数据为:1, 2, 3, 5, 7, 8, 9, 12, 13。
第9次,从第9位开始,只剩下1位数字,不用交换。
代码实现
public class Code02_SelectionSort {
public static void main(String[] args) {
int[] arr = {3, 5, 2, 7, 13, 8, 1, 9, 12};
print(arr);
selectionSort(arr);
print(arr);
}
public static void print(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void selectionSort(int[] arr) {
if (arr == null || arr.length == 1) {
return;
}
int N = arr.length;
for (int i = 0; i < N; i++) {
int minIdx = i;
for (int j = i + 1; j < N; j++) {
minIdx = arr[j] < arr[minIdx] ? j : minIdx;
}
swap(arr, minIdx, i);
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
运行输出结果为:
3 5 2 7 13 8 1 9 12
1 2 3 5 7 8 9 12 13
冒泡排序
冒泡排序,就是从给定的数组里,从开头每两个数进行比较,谁大谁往后放,对数组进行重复扫描,直到所有的数据都排列好。
排序原理
- 从前往后依次比较相邻的元素,若后面的元素比前面的小,就交换这2个元素,否则保持不变。
- 对每一对相邻元素做同样的工作,进行一轮比较交换下来,最后的元素就会是最大的数了。
- 针对所有的元素重复以上的步骤,直到排序完成。
给定一组数据:
3, 5, 2, 7, 13, 8, 1, 9, 12
第1轮,从第1位开始,首先3和5比较,保持不变;5和2比较,进行交换;5和7比较,保持不变;7和13比较,保持不变;13和8比较,进行交换;13和1比较,进行交换;13和9比较,进行交换;13和12比较,进行交换。第1轮结束,结果为:3, 2, 5, 7, 8, 1, 9, 12, 13。
第2轮,从第1位开始,首先3和2比较,进行交换;3和5比较,保持不变;5和7比较,保持不变;7和8比较,保持不变;8和1比较,进行交换;8和9比较,保持不变;9和12比较,保持不变。第2轮结束,结果为:2, 3, 5, 7, 1, 8, 9, 12, 13。
以此类推,最终结果为1, 2, 3, 5, 7, 8, 9, 12, 13。
代码实现
public class Code03_BubbleSort {
public static void main(String[] args) {
int[] arr = {3, 5, 2, 7, 13, 8, 1, 9, 12};
print(arr);
bubbleSort(arr);
print(arr);
}
public static void bubbleSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int i = arr.length - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
}
}
}
// 交换arr的i和j位置上的值
public static void swap(int[] arr, int i, int j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
public static void print(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
}
执行结果为:
3 5 2 7 13 8 1 9 12
1 2 3 5 7 8 9 12 13