再长的路,一步步也能走完;再短的路,不迈开双脚也无法到达。
上周我们学习了最简单的数组排序,直接调用java的Arrays包中的sort()方法就可以对数组进行简单的升序排序。降序就是利用Collections.reverseOrder()方法进行排序。本周呢我们继续来学习数组的另外几种高大上一点的排序算法,主要包括冒泡、快速、选择和直接插入排序法。
一、冒泡排序法
冒泡排序的基本思想是:对比相邻的元素值,如果满足条件就交换元素值,把较小的元素值移动到数组前面,把大的元素值移动到数组后面(也就是交换两个元素的位置),这样数组元素就像气泡一样从底部上升到顶部。
二、快速排序法
快速排序的基本思想是:通过一趟排序,将要排序的数据分隔成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此使整个数据变成有序序列。
三、选择排序法
选择排序是指每一趟从待排序的数据元素中选出最大(或最小)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
四、直接插入排序法
直接插入排序法的基本思想是:将n个有序数存放在数组a中,要插入的数为x,首先确定x插在数组中的位置p,然后将p之后的元素都向后移一个位置,空出a(p),将x放入a(p),这样可实现插入x后仍然有序。
五、实战
5.1 冒泡排序
5.2 快速排序
5.3 选择排序
5.4 直接插入排序
源码:
1、
package first.array;
import java.util.Scanner;//导入Scanner类方便从键盘输入
public class Bubble {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
double[] score = new double[5]; //可以自己规定数组长度
for (int i = 0; i < score.length; i++) {
System.out.print("请输入第 " + (i + 1) + " 个成绩:");
score[i] = scan.nextDouble();
}
System.out.println("排序前的元素值:");
for(double val:score) {
System.out.print(val+"\t");
}
System.out.println();
System.out.println("通过冒泡排序方法对数组"+ "进行排序:"); for (int i = 0; i < score.length - 1; i++) {
// 比较相邻两个元素,较大的数往后冒泡
for (int j = 0; j < score.length - 1 - i; j++) {
if (score[j] > score[j + 1]) {
double temp = score[j + 1]; // 把第一个元素值保存到临时变量中
score[j + 1] = score[j]; //把第二个元素值转移到第一个元素变量中
score[j] = temp; //把临时变量(第一个元素的原值)保存到第二个元素中 }
System.out.print(score[j] + " "); // 对排序后的数组元素进行输出
}
System.out.print("【");
for(int j=score.length-1-i;j<score.length;j++) {
System.out.print(score[j] + " ");
}
System.out.println("】");
}
}
}
2、
package first.array;
import java.util.Scanner;
public class QuickSort {
public static void quickSort(int[] number, int low,int high){
int i,j,temp,t;
if(low>high){
return;
}
i=low;
j=high;
//temp就是基准位
temp = number[low];
while (i<j) {
//先看右边,依次往左递减
while (temp<=number[j]&&i<j) {
j--;
}
//再看左边,依次往右递增
while (temp>=number[i]&&i<j) {
i++;
}
//如果满足条件则交换
if (i<j) {
t = number[j];
number[j] = number[i];
number[i] = t;
}
}
//最后将基准为与i和j相等位置的数字交换
number[low] = number[i];
number[i] = temp;
//递归调用左半数组
quickSort(number, low, j-1);
//递归调用右半数组
quickSort(number, j+1, high);
}
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int[] number = new int[3]; //可以自己规定数组长度
for (int i = 0; i < number.length; i++) {
System.out.print("请输入第 " + (i + 1) + " 个元素:");
number[i] = scan.nextInt();
}
System.out.println("排序前的元素值:");
for(int val:number) {
System.out.print(val+"\t");
}
System.out.println();
quickSort(number, 0, number.length-1);
for (int i = 0; i < number.length; i++) {
System.out.print(number[i]+"\t");
}
}
}
3、
package first.array;
import java.util.Scanner;
public class Select {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int[] number = new int[6]; //可以自己规定数组长度
for (int i = 0; i < number.length; i++) {
System.out.print("请输入第 " + (i + 1) + " 个元素:");
number[i] = scan.nextInt();
}
System.out.println("排序前的元素值:");
for(int val:number) {
System.out.print(val+"\t");
}
System.out.println();
String end="\n";
int index;
for (int i = 1; i < number.length; i++) {
index = 0;
for (int j = 1; j <= number.length - i; j++) {
if (number[j] > number[index]) {
index = j; //查找最大值
}
}
end = number[index] + " " + end; //定位已排好的数组元素
int temp = number[number.length - i];
number[number.length-1]=number[index];
number[index] = temp;
System.out.print("【");
for (int j = 0; j < number.length - i; j++) {
System.out.print(number[j] + " ");
}
System.out.print("】" + end);
}
}
}
4、
package first.array;
public class Insert {
public static void main(String[] args) {
int[] number = { 56, 45, 46, 75, 78, 43 };
System.out.println("排序前:");
for (int val : number) { // 遍历数组元素
System.out.print(val + " ");// 输出数组元素
}
int temp, j;
for (int i = 1; i < number.length; i++) {
temp = number[i];
for (j=i-1;j>=0 && number[j]>temp;j--) {
number[j + 1] = number[j];
}
number[j + 1] = temp;
}
System.out.println("\n排序后:");
for (int val : number) { // 遍历数组元素
System.out.print(val + " "); // 输出数组元素
}
}
}