一、冒泡排序
以升序为例:
- 从第一个元素开始,比较相邻的两个元素。如果第一个比第二个大,则进行交换。
- 轮到下一组相邻元素,执行同样的比较操作,再找下一组,直到没有相邻元素可比较为止,此时最后的元素应是最大的数。
- 除了每次排序得到的最后一个元素,对剩余元素重复以上步骤,直到没有任何一对元素需要比较为止。
void bubbleSort(int[] nums) {
if (nums == null) return;
int length = nums.length;
if (length < 2) return;
for (int i = 0; i < length; i++) {
for (int j = 0; j < length - i - 1; j++) {
if (nums[j] > nums[j + 1]) {
int cache = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = cache;
}
}
}
}
二、快速排序
三、直接插入排序
以升序为例:
- 循环数组,当前的元素值与前一个元素值比较,如果小于前一个值,则需要执行插入。
- 插入的位置,从当前元素下标开始,找到元素大于当前元素的位置。index >= 0 && arr[index] > cache
void insertSort(int[] arr) {
if (arr == null) return;
int length = arr.length;
if (length < 2) return;
for (int i = 1; i < length; i++) {
// 升序
if (arr[i] < arr[i - 1]) {
int cache = arr[i];
// 目前元素即将插入的下标
int index;
for (index = i - 1; index >= 0 && arr[index] > cache; index--) {
arr[index + 1] = arr[index];
}
arr[index + 1] = cache;
}
}
}
四、选择排序
以升序为例:
- 选择排序思想的暴力实现,每一趟从未排序的区间找到一个最小元素,并放到第一位,直到全部区间有序为止。
void selectSort(int[] arr) {
if (arr == null) return;
int length = arr.length;
if (length < 2) return;
for (int i = 0; i < length; i++) {
int selectIndex = i;
for (int j = i+1; j < length; j++) {
if (arr[j] < arr[selectIndex]) {
selectIndex = j;
}
}
if (selectIndex != i) {
int cache = arr[i];
arr[i] = arr[selectIndex];
arr[selectIndex] = cache;
}
}
}