冒泡排序
冒泡排序算法運(yùn)行起來非常慢,但在概念上它是排序算法中最簡單的咽袜,因此冒泡排序算法在剛開始研究排序技術(shù)時(shí)是一個(gè)非常好的算法坝辫。
冒泡排序原理即:從數(shù)組下標(biāo)為0的位置開始创橄,比較下標(biāo)位置為0和1的數(shù)據(jù),如果0號(hào)位置的大含懊,則交換位置身冬,如果1號(hào)位置大,則什么也不做岔乔,然后右移一個(gè)位置酥筝,比較1號(hào)和2號(hào)的數(shù)據(jù),和剛才的一樣雏门,如果1號(hào)的大嘿歌,則交換位置,以此類推直至最后一個(gè)位置結(jié)束茁影,到此數(shù)組中最大的元素就被排到了最后宙帝,之后再根據(jù)之前的步驟開始排前面的數(shù)據(jù),直至全部數(shù)據(jù)都排序完成募闲。
冒泡排序代碼
package com.java.demo;
import java.util.Random;
/*
* 數(shù)組排序冒泡排序:
*/
public class ArrayTest1 {
public static void main(String[] args) {
//創(chuàng)建一個(gè)數(shù)組
int[] arr = new int[5];
//創(chuàng)建隨機(jī)數(shù)對(duì)象
Random rd = new Random();
for (int i = 0; i < arr.length; i++) {
//獲取1-10的隨機(jī)數(shù)
int num = rd.nextInt(10)+1;
//對(duì)數(shù)組進(jìn)行賦值
arr[i] = num;
}
System.out.println("數(shù)組排序前:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
//對(duì)數(shù)組進(jìn)行排序步脓,冒泡排序
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length-1-i; j++) {
//進(jìn)行判斷,如果前面的大于后面是不是進(jìn)行互換浩螺,這里要用到中間變量
if (arr[j]>arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println();
System.out.println("數(shù)組排序后:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
}
冒泡排序原理圖
選擇排序
選擇排序原理即:在選擇排序中靴患,不再只比較兩個(gè)相鄰的數(shù)據(jù)。因此需要記錄下某一個(gè)數(shù)據(jù)的下標(biāo)要出,進(jìn)行選擇排序就是把所有的數(shù)據(jù)掃描一遍鸳君,從中挑出(按從小到大排序)最小的一個(gè)數(shù)據(jù),這個(gè)最小的數(shù)據(jù)和最左端下標(biāo)為0的數(shù)據(jù)交換位置患蹂。之后再次掃描數(shù)據(jù)或颊,從下標(biāo)為1開始砸紊,還是挑出最小的然后和1號(hào)位置進(jìn)行交換,這個(gè)過程一直持續(xù)到所有的數(shù)據(jù)都排定囱挑。而程序中需要有一個(gè)標(biāo)識(shí)變量來標(biāo)識(shí)每次挑出最小數(shù)據(jù)的下標(biāo)醉顽。
選擇排序代碼
package com.java.demo;
import java.util.Random;
/*
* 數(shù)組排序選擇排序:
*/
public class ArrayTest2 {
public static void main(String[] args) {
// 定義一個(gè)數(shù),動(dòng)態(tài)初始化
int[] arr = new int[5];
// 創(chuàng)建生成隨機(jī)數(shù)的對(duì)象
Random rd = new Random();
// 對(duì)數(shù)組進(jìn)行賦值
for (int i = 0; i < arr.length; i++) {
// 獲取1-100的隨機(jī)數(shù)
int num = rd.nextInt(100) + 1;
arr[i] = num;
}
// 打印
System.out.println("數(shù)組未排序前:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
// 對(duì)數(shù)組進(jìn)行排序看铆,選擇排序
for (int i = 0; i < arr.length; i++) {
for (int j = i + 1; j < arr.length; j++) {
// 判斷
if (arr[i] > arr[j]) {
// 進(jìn)行互換
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
System.out.println();
// 打印
System.out.println("數(shù)組排序后:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
選擇排序原理圖
冒泡排序和選擇排序效率
一般來說選擇排序效率比較高徽鼎,因?yàn)橹灰粨Q一次盛末,但是冒泡也可以只記錄坐標(biāo)然后做一次性變換弹惦,只是犧牲空間復(fù)雜度。但是冒泡有個(gè)很大的優(yōu)點(diǎn)就是它可以檢測(cè)整個(gè)數(shù)組是否已經(jīng)有序悄但,當(dāng)某次遍歷沒有發(fā)生任何交換的時(shí)候你就可以提前終止了棠隐。也算是個(gè)小優(yōu)化吧。