冒泡排序
图解
代码实现
/**
* @Description:冒泡排序
* @date 2021/9/5 9:30
*/
public static int[] bubbleSort(int[] a){
/**
* @Description:如果数组长度为 n,一共要进行 n-1 次排序,每次确认一个最大或最小值
*/
for (int i = 0; i < a.length - 1; i++) {
/**
* @Description:每一个排序,要进行 n-1-i 次比较
*/
for (int j = 0; j < a.length - 1 -i; j++){
// 如果序号为0元素大于序号为1的元素,则交换
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
// 返回有序数组
return a;
}
测试
int[] a = {-23, 6, 5, 86, 99, 1000, -98};
int[] sort = bubbleSort(a);
for (int s : sort){
System.out.print(s + ", ");
}
如果要优化,那就是第一次排序如果没有元素交换,就证明原来的数组就是有序的,我们可以不用进行后面的排序了
选择排序
图解
- 第一次排序
- 第二次排序
- 如果数组长度为n,以此类推一共进行了 n - 1次排序
代码实现
/**
* @Description:选择排序
* @date 2021/9/5 10:43
*/
public static int[] selectSort(int[] a) {
// 选择排序的排序次数
for (int i = 0; i < a.length - 1; i++){
// 赋初值和标记最小值的下标
int min = a[i];
int minIndex = i;
for (int j = i + 1; j < a.length; j++){
// 拿后面的值和当前最小值比较,比它小则赋值给最小值,且标记当前最小值下标
if (min > a[j]) {
min = a[j];
minIndex = j;
}
}
// 第一次排序比较完成后,查询最小值下标是否变化,没有变化则表示当前值已经是最小值,不用交换位置,反之则交换位置
if (i != minIndex){
a[minIndex] = a[i];
a[i] = min;
}
}
return a;
}
插入排序
图解
代码实现
/**
* @Description:插入排序
* @date 2021/9/5 10:58
*/
public static int[] insertSort(int[] a)
{
for (int i = 0; i < a.length - 1; ++i) {
// 记录有序序列最后一个元素的下标,一开始标记的是第一个
int end = i;
// 待插入的元素,第二个元素是待插入的元素,往第一个元素形成的有序序列插入
int insert = a[end + 1];
// 单趟排
while (end >= 0) {
// 插入的数如果比有序序列最后的值(也就是最大的值)大,就不用改变位置,直接已经是最大的数了而且位置是排正确了
// 如果小,就把有序数组最后的数往后移一个位置
if (insert < a[end]) {
a[end + 1] = a[end];
// end--就是把待插入的值下标往前移一位,因为上面一行代码表示前一个数已经往后移动了
// 如果end下标小于0则证明待插入的值是最小的了
end--;
} else {
// 比插入的数小,跳出循环,否则一直比较
break;
}
}
// 待插入的值放到比它小的数的后面
a[end + 1] = insert;
// 代码执行到此位置有两种情况:
// 1.待插入元素找到应插入位置(break跳出循环到此)
// 2.待插入元素比当前有序序列中的所有元素都小(while循环结束后到此)
}
return a;
}
快速排序
图解
代码实现
/**
* @Description: 快速排序
* @Param a:初始数组
* @Param left:右指针
* @Param right:左指针
* @date 2021/9/5 11:45
*/
public static int[] quickSort(int[] a, int left, int right) {
// 如果左指针大于等于右指针则表明已完成一趟排序
if (left >= right) {
return a;
}
int l = left;
int r = right;
while (l < r) {
// 先比较右指针,如果右指针指向的值比基准值大则把右指针往左移一位
while (l < r && a[r] >= a[left]){
r--;
}
// 然后比较左指针,如果左指针指向的值比基准值小则把左指针往右移一位
while (l < r && a[l] <= a[left]){
l++;
}
if (r == l) {
int temp = a[r];
a[r] = a[left];
a[left] = temp;
} else {
int temp = a[r];
a[r] = a[l];
a[l] = temp;
}
}
// 左边进行递归快排
quickSort(a, left, l-1);
// 右边进行递归快排
quickSort(a, r + 1, right);
// 返回排好的序列
return a;
}