1.冒泡排序
冒泡排序可以说是排序算法中最为简单的一种。
核心思想: 相邻元素做比较,两两比较小靠前。
1.将相邻的两个元素进行比较,比较完后,按照元素大小进行移位,小的移动到前面,大的移动到后面。
2.每一轮比较完后,“最大的元素” 将被移位到最后。在下一轮比较的时候,这个 “最大的元素” 就不需要再参与比较了。
3.重复进行上述步骤,经过 N - 1 轮比较之后,排序完成。(N:代表的是要比较的元素个数)
原数 9, 7, 8, 6, 2
第一轮:
9 7比较 7 9 变成 7 9 8 6 2
9 8比较 8 9 变成 7 8 9 6 2
9 6比较6 9 变成 7 8 6 9 2
9 2比较 2 9 变成 7 8 6 2 9
第二轮:
7 6 2 8 9
第三轮:
6 2 7 8 9
第四轮:
2 6 7 8 9
原数 9, 7, 8, 6, 2 一共5个数 比较4轮 也就是外层循环
第一轮 比较4次 第二轮 比较3次,也就是内层循环
int[] arr = { 9, 7, 8, 6, 2 };
//外层循环 循环的轮数
for (int i = 0; i < arr.length - 1; i++) {
// - 1 是为了防止数组遍历出现:下标越界异常
// - i 是为了排除上一轮比较的最大元素
//内层循环 循环的次数
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
输出[2, 6, 7, 8, 9]
2. 选择排序
1.第一次比较的时候,先将 “第一个元素” 假定为最小元素值。
2.然后将第一个元素依次和后面的所有元素进行比较大小,如果后面的元素比第一个元素小,则进行交换。
3.每一轮比较完后,“最小的元素” 将被移位到 “第一个元素位置”。在下一轮比较的时候,这个 “最小的元素” 就不需要再参与比较了。
4.重复的进行上面步骤,经过 N - 1 轮比较之后,排序完成。(N:代表的是要比较的元素个数)
原数:9, 7, 8, 6, 2
第一轮: 2 9 8 6 7
9, 7 变成 7 9 8 6 2
7 8 变成 7 9 8 6 2
7 6 变成6 9 8 7 2
6 2变成 2 9 8 7 6
第二轮 26987
2 9 8 7 6
9 8 变成 28976
8 7 27986
7 6 26987
第三轮 26798
第四轮26789
int[] arr = { 9, 7, 8, 6, 2 };
for (int i = 0; i < arr.length-1; i++) {
// 初始值 i + 1 是为了排除自己和自己比较的问题(第一个元素要和第二个元素开始比较)
//内层循环 比较的是每轮获取到的数据
for (int j = i+1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
输出[2, 6, 7, 8, 9]
3.插入排序
1.首先将第一个元素就看作是一个已经排序好的数列,后面的其他元素则看作未排序数列。
2.然后将第二个元素在已经排序好的数列中,做插入动作。即在已经排序好的数列中,从后向前依次查找符合升序规律的位置,并插入到该位置。
int[] arr = { 9, 7, 8, 6, 2 };
for (int i = 0; i < arr.length - 1; i++) {
//j--是因为只和前面的比较排序
for (int j = i + 1; j > 0; j--) {
// 在有序数列中查找位置做插入,并保持有序。
if (arr[j] < arr[j - 1]) {
int temp = arr[j - 1];
arr[j - 1] = arr[j];
arr[j] = temp;
}
}
System.out.println(Arrays.toString(arr));
}