生活随笔
收集整理的這篇文章主要介紹了
排序算法(一)--桶排序、冒泡、快排(JAVA)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
排序算法匯總
參考書籍–《啊哈!算法》 作者:啊哈磊
首先提出一個問題:班內有5名同學,成績分別為5,8,2,4,2分(滿分10分),需要將成績從小到大排序
簡化版 桶排序
時間復雜度O(N)
import java.util.Scanner;
public class Bucket_sort {public static void main(String[] args) {Scanner input =
new Scanner(System.in);
int n = input.nextInt();
/*** 需要進行排序的數字范圍在 0-5之間* */int[] a =
new int[
6];
/*** 注意并非將數據存起來,而是在對應的“桶”內計數,最后統計出現次數* */for (
int i =
0; i < n; i++) {
int k = input.nextInt();a[k]++;}
/*** 打印 內循環控制重復數據要重復讀取* */for (
int i =
0; i <
6; i++) {
for (
int j =
0; j < a[i] ; j++) {System.out.println(i);}}}
}
存疑一:這樣成績是按順序存起來了,但是如果現在的情況是Lili 5分,Tony 8分,Joy 2分,Peter 3分,Ben 2分。如何在保證姓名和成績對應的情況下排序呢??
另一方面,桶排序需要用到的“桶”的個數跟數據的最大值有關系,這里滿分為10分只需要10個桶,但是如果數據量較少,但是數據的值較大的時候則會浪費大量空間。
冒泡排序算法
時間復雜度O(n^2)
import java.util.Scanner;
public class Bubble_sort {public static void main(String[] args) {Scanner input =
new Scanner(System.in);
int[] a =
new int[
100];
int n =input.nextInt();
/*** 輸入n個數* */for (
int i =
0; i < n; i++) {a[i] = input.nextInt();}
/*** 冒泡排序核心算法* */for (
int i =
0; i < n-
1; i++) {
for (
int j = i+
1; j < n; j++) {
if (a[i] > a[j]) {
int temp = a[i];a[i] = a[j];a[j] = temp;}}}
/*** 打印* */for (
int i =
0; i < n; i++) {System.out.print(a[i] +
" ");}}
}
上面的冒泡排序為基本的算法,若想解決存疑一,只需要稍加變通即可實現
存疑二:冒泡排序解決了桶排序浪費空間的難題,但是這種排序算法采用雙重循環,時間復雜度為指數級別,效率實在是不夠好,有沒有可以更快捷的方法呢?
快速排序
時間復雜度O(N·logN)
import java.util.Scanner;
public class Fast_sort {static int n;
static int[] a;
public static void main(String[] args) {Scanner input =
new Scanner(System.in);n = input.nextInt();a =
new int[n];
for (
int i =
0; i < n; i++) {a[i] = input.nextInt();}fastsort(
0, n-
1);
/*** 打印* */for (
int i =
0; i < n; i++) {System.out.print(a[i] +
" ");}}
public static void fastsort(
int left,
int right) {
if (left > right) {
return;}
int temp = a[left];
int i = left;
int j = right;
/*** i == j 的時候為“一趟”結束的時候* */while (i != j) {
/*** 順序一定要從j開始,* a[j]如果不小于temp則前進,a[i]如果不大于temp則前進** */while (a[j] >= temp && i < j) {j--;}
while (a[i] <= temp && i < j) {i++;}
/*** 前進過程出現跳出while循環,則需要進行交換* */if (i < j) {
int t = a[i];a[i] = a[j];a[j] = t;}}
/*** 基準歸位* */a[left] = a[i];a[i] = temp;
/*** 處理左側* */fastsort(left, i-
1);
/*** 處理右側* */fastsort(i+
1, right);}
}
通過快速排序就可以很好的解決存疑二中沒有解決的問題了,這種排序算法在時間和空間上都得到了一個很好的利用。
再來一個問題:給出一串數字,這些數字沒有順序,而且還有許多重復的,我們需要完成排序和去重兩個步驟
那么問題可以通過兩種方法解決
1)先去重,后排序
解決思路:利用桶排序,在往“桶”中添加的時候,不采用a[i]++;,而是a[i] = 1;這樣即使是重復的也不會多次計數了。
2)先排序,后去重
解決思路:可以利用冒泡和快排,由于排序完的序列,重復值都會在一個區間內,這樣在輸出的時候加個if判斷即可實現。
存疑三:若是數據值十分巨大,該如何選擇算法?
若數據量十分龐大,又該如何選擇算法?
顯然,對于數據值較大的題目,桶排序并不適合
而對于數據量較多的題目,冒泡排序要運行相當長的時間。所以快速排序真的是一個有效、方便的算法呢!!!
總結
以上是生活随笔為你收集整理的排序算法(一)--桶排序、冒泡、快排(JAVA)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。