冒泡排序
思想:
- N 个元素需要排序 N-1 趟, 每趟比较相邻的两个元素,如果前一个元素和后一个元素不满足大小顺序规则,则交换位置,这样一趟下来,一趟中的最大(最小)的元素就 “沉” 到最后面的位置。
- 执行 M 趟排序后,整个元素序列中的最后面的 M 个元素就排好顺序了,剩下就只需要将前面的 N-M 个元素排好序即可。
private void sortBubble(int[] arr) {
// 需要比较的趟数 N-1
for (int i = 0; i < arr.length - 1; i++) {
// 每趟中比较前面的 N-M 个相邻的两个元素,不满足就交换位置,这样最大或最小的就沉到最后面位置
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j + 1] < arr[j]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
选择排序
思想:
- N 个元素需要排序 N-1 趟,每趟中找到最大(小)值,放在待排序序列中的第一个位置,这样一趟下来,最大值或最小值就放在最前面。
- 执行 M 趟排序后,整个元素序列中的最前面的 M 个元素就排好顺序了,剩下就只需要将后面的 N-M 个元素排好序即可
private void sortSelect(int[] arr) {
// N 个元素需要排 N-1 趟,每趟中找出最大或最小值,
for (int i = 0; i < arr.length - 1; i++) {
// 将待排序序列中第一个元素先假定为最大(小)值
int min = i;
for (int j = i; j < arr.length - i; j++) {
// 如果一趟下来,有比第一个元素大或小元素,则将最小下标设定该下标
if (arr[j] < arr[min]) {
min = j; //重点在这,最小值下标将会被 次小值下标 替换
}
}
// 交换位置
if (min != i) {
int temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
}
插入排序
思想:
- 整个序列分为:已经排好序的序列和待排序的序列,每趟从待排序序列中取出第一个元素,插入到已经排好序的序列合适的位置。
- 将插入位置的后面元素依次往后移动位置。
private void sortInsert(int[] arr) {
for (int i = 1; i < arr.length; i++) {
// 待排序序列的第一个元素
int temp = arr[i];
int j = i - 1;
// 待排序元素插入到已排好序序列中的合适位置
while (j > 0 && temp < arr[j]) {
arr[j + 1] = arr[j]; // 依次往后移动一个位置
j--;
}
arr[j + 1] = temp;
}
}