冒泡排序
什么是 冒泡排序,就是让两个元素 两两比较,然后 把大的元素往后移动,把无序的排序成一个有序的 ,这么说 可能看不太懂 , 我们举个例子
假如数组中 又 { 5 , 4,3 ,2 ,1}这五个元素
我们 先让5 和4 比较 ,谁大,就让谁交换 , 显然 5大于4,需要交换 交换后数组变成了 { 4,5,3,2,1}
然后进入第二轮 让 5 和 3 比较 谁大交换 ,直到比到1 的时候 ,数组变成了 {4,3,2,1,5}
然后 再次 从 数组索引1 也就是元素4 开始,继续新一轮的比较,直到交换了所有元素
怎么控制 每一次新一轮的比较,显然 用 两个for循环,最内层for控制 每次的索引0 开始元素 跟所有的元素比较也就是 {5,4,3,2,1,}变成{{4,3,2,1,5}的过程,外层for控制 内层的循环比较一次之后,开启每一轮新的比较的次数 也就是又从 {4,3,2,1,5}开始再次比较
代码实现
public static void main(String[] args) {
int []arr={9,8,7,6,5,4,3,2,1};
bubbleSortVersion1(arr);
}
public static void bubbleSortVersion1(int []arr){
for (int j = 0; j < arr.length; j++) {
for (int i = 0; i <arr.length-1 ; i++) {
if(arr[i]>arr[i+1]){
int temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
还有一种更优雅的实现,能够减少 时间复杂度为n的2次方的次数 情况
public static void bubbleSortVersion2(int[] arr){
while(true){
int border=0;
// 0 1 2 3 4 2 4 6 8 9 3
for (int i = 0; i < arr.length-1; i++) {
if(arr[i]>arr[i+1]){
int temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
border=i;
}
}
if (border==0){
break;
}
}
System.out.println(Arrays.toString(arr));
}
选择排序
选择排序 顾名思义 也就是在冒泡排序的基础上排序,冒泡排序是无论是什么i情况我们都比较一次
,选择排序是 我们在每一次的内层循环中 找一个最大的元素,然后 把该最大的元素交换到数组末尾,然后 再次用外层for循环 控制次数比较
代码实现
void selectionSort(int[] arr) {
// 外层循环控制排序的轮数
for (int i = 0; i < arr.length - 1; i++) {
// 假设当前位置的元素是未排序部分中最大的
int maxIndex = i;
// 内层循环找出未排序部分中的最大元素的索引
for (int j = i + 1; j < arr.length; j++) {
// 如果找到更大的元素,则更新最大元素的索引
if (arr[j] > arr[maxIndex]) {
maxIndex = j;
}
}
// 如果最大元素不是当前轮次的起始元素,则交换它们
if (maxIndex != i) {
// 交换 arr[i] 和 arr[maxIndex]
int temp = arr[i];
arr[i] = arr[maxIndex];
arr[maxIndex] = temp;
}
}
}