关于三种排序:冒泡排序、直接排序、快速排序
程序员文章站
2022-05-18 15:30:39
...
1.冒泡排序
冒泡排序是这三种排序中最容易理解的方法,其主要原理是在一串数据中,将第一个数与其它相邻的数比较大小,如果大于其它的数,继续往后比较;如果小于那个数,则用那个数继续与后面的数作比较,最后一串数中最大的那个放在最后,其它的数再继续上一轮的操作,直到比完所有的数。
3,5,2,9,6,1,4,7,8
3,5,2,6,1,4,7,8 9
3,5,2,6,1,4,7 8 9
3,5,2,6,1,4 7 8 9
...
1 2 3 4 5 6 7 8 9
代码如下:
package com;
import java.util.Arrays;
import java.util.Random;
/**
* 冒泡排序
*
* @author Eryu
*
*/
public class 冒泡排序 {
public static void main(String[] args) {
Random rd = new Random();// 调用随机函数
System.out.println("随机生成的100以内10个数的数组:");
int[] buf = new int[10];
for (int i = 0; i < buf.length; i++) {//for循环将随机到的数输入到数组中
buf[i] = rd.nextInt(100);
}
System.out.println(Arrays.toString(buf));//用toString方法直接将所有的数由数组的方式输出
for (int i = 0; i < buf.length -1; i++) {//外层循环控制比较轮数
for (int j = 0; j < buf.length - i -1; j++) {//内层循环控制每一轮数之间比较的次数
if (buf[j] > buf[j + 1]) {
buf[j] = buf[j] ^ buf[j + 1];
buf[j + 1] = buf[j] ^ buf[j + 1];
buf[j] = buf[j] ^ buf[j + 1];//异或的方式交换j和j+1,也可以用下面哪种方式交换
// if (array[j] < array[j + 1]) {
// int temp = array[j];
// array[j] = array[j + 1];
// array[j + 1] = temp;
// }
}
}
}
System.out.println("排序好的数组为:");
System.out.println(Arrays.toString(buf));
}
}
2.直接选择排序
直接选择排序如同其名字一样很直接,就是在一串数字中,假定第一个数最大,然后与其后面的数字作比较,如果后面的数字比它大,就直接和后面的数字交换,再在刚刚的位置往后比较
代码如下:
package com;
import java.util.Arrays;
import java.util.Random;
/**
* 直接选择排序
*
* @author Eryu
*/
public class 直接选择排序 {
public static void main(String[] args) {
Random rd = new Random();
int[] buf = new int[10];
for (int i = 0; i < buf.length; i++) {
buf[i] = rd.nextInt(100);
}
System.out.println(Arrays.toString(buf));
for (int i = 0; i < buf.length - 1; i++) {// 外层循环控制比较轮数
for (int j = i; j < buf.length; j++) {// 内心循环控制每一轮比较次数
if (buf[i] > buf[j]) {
buf[i] = buf[i] ^ buf[j];
buf[j] = buf[i] ^ buf[j];
buf[i] = buf[i] ^ buf[j];
}
}
}
System.out.println(Arrays.toString(buf));
}
}
3.快速排序
快速排序是所有排序方法中最为快速的排序方法,其原理是取第一个数为标记数,将数组首尾进行比较,如果首位大于末位,则两数进行交换,比较后如果标记数在第一个,则末位的前面一个数再和第一位标记数作比较,大于标记数则不变,小于则交换位置;如果标记数在第一轮被换到了最后一位,则用第一位数后面的数与标记数作比较,如果大于标记数,就交换,再用被交换后的那位数的前面一位和标记数比较,依次类推。最后标记数会别交换到数组的*,标记数前面的数都比它小,后面的数都比它大,然后分为两块,又是两个数组内部作比较,用之前的方法,直到排序完成。
代码如下:
package com;
import java.util.Arrays;
import java.util.Random;
/*
* 快速排序
*/
public class 快速排序 {
public static void main(String[] args) {
int[] buf = new int[10];
Random rd = new Random();
for (int i = 0; i < buf.length; i++) {
buf[i] = rd.nextInt(100);//随机一个数组
}
System.out.println(Arrays.toString(buf));
quickSort(buf, 0, buf.length - 1);//调用下面写的快排方法
System.out.println(Arrays.toString(buf));
}
public static void quickSort(int[] buf, int sta, int end) {
int m = buf[sta];
int i = sta;//定义一个起始值的脚标
int j = end;//定义一个结尾值的脚标
while (i < j) {//i始终在j的左边
//初步将小于m的数排到左边,大于m的数排到右边
while (i < j) {
if (m > buf[j]) {
buf[i] = buf[i] ^ buf[j];
buf[j] = buf[i] ^ buf[j];
buf[i] = buf[i] ^ buf[j];
i++;
break;
} else {
j--;
}
}
while (i < j) {
if (buf[i] > m) {
buf[i] = buf[i] ^ buf[j];
buf[j] = buf[i] ^ buf[j];
buf[i] = buf[i] ^ buf[j];
j--;
break;
} else {
i++;
}
}
}
//m左边的数再次快排
if (i - sta > 1) {
quickSort(buf, sta, i-1);
}
//m右边的数再次快排
if (end - j > 1) {
quickSort(buf, i+1, end);
}
}
}
下一篇: vue中路由传参的三种方式