這三種排序有倆個過程:java
1.比較倆個數據。 算法
2.交換倆個數據或複製其中一項。數組
這三種排序的時間級別優化
冒泡排序:比較 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2spa
交換 0——N2/2 = N2/4code
總時間 3/4*N2
blog
選擇排序:比較 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2排序
交換 0——3*(N-1)=3*(N-1)/2=3/2*Nio
總時間 N2/2+3/2*Nclass
插入排序:第一輪最多比較一次,第二輪最多比較倆次,最後一輪比較N-1次,因此最多比較N*(N-1)/2。
複製的次數和比較的次數大體相等,可是複製消耗的時間比交換要小.
比較 0——N*(N-1)/2=N*(N-1)/4=N2/4
複製 0——N*(N-1)/2=N*(N-1)/4=N2/4
總時間 N2//2
總結:插入排序算法比冒泡快一倍,比選擇排序略快一點,但這些算法都是O(N2)的時間級別。
這三種排序的思想
冒泡排序:在首輪,第一項和第二項比較,將大的放在後面,而後比較第二項和第三項,將大的放在後面,以此類推在首輪結束,最大的數據已經在最後一項了。在一輪輪的比較中,後面的已經排好的數據項愈來愈多,須要排序的數據項愈來愈少,直到爲零。
選擇排序:在冒泡排序上作了優化,減小了交換次數,在首輪選擇最小的數放在第一項,一輪以後第一項是有序的了,第二輪從第二項開始選擇最小的數放在第二項,以此類推,直到整個數組徹底有序。
插入排序:和前倆種排序不一樣,插入排序在排序過程當中是局部有序,隨着插入項的增多,有序部分的項的位置會發生改變,而冒泡排序和選擇排序每輪肯定的項數的位置是永遠不變的。在首輪,選擇第二項做爲插入項,而後取出這一項放在一個變量中,和前一項比較並且小,則前一項後移到第二項的位置,而後第二項也就是插入項放在前一項的位置,第二輪選擇第三項做爲插入項而後取出和前一項也就是第二項比較若是小,第二項後移到插入項,而後插入相在和第一項比較若是小,則第一項後移到第二項,插入項放在第一項,以此類推。
這三種排序的java程序
1.冒泡排序
package aa; class BubbleSort{ private long[] a; private int nElems; public BubbleSort(int max){ a = new long[max]; nElems = 0; } public void insert(long value){ a[nElems] = value; nElems ++; } public void display(){ for(int i = 0; i < nElems; i++) { System.out.println(a[i] + " "); } System.out.println(""); } public void bubbleSort(){ for(int i = 0; i < nElems - 1; i++) { for(int j = 0; j < nElems - 1 - i; j++) { if(a[j] > a[j + 1]) { long temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } } } public class BubbleSortApp { public static void main(String[] args){ BubbleSort arr = new BubbleSort(100); arr.insert(77); arr.insert(99); arr.insert(44); arr.insert(55); arr.insert(22); arr.insert(88); arr.insert(11); arr.insert(00); arr.insert(66); arr.insert(33); arr.display(); arr.bubbleSort(); arr.display(); } }
2.選擇排序
package aa; class SelectSort{ private long[] a; private int nElems; public SelectSort(int max){ a = new long[max]; nElems = 0; } public void insert(long value){ a[nElems] = value; nElems ++; } public void display(){ for(int i = 0; i < nElems; i++) { System.out.println(a[i] + " "); } System.out.println(""); } public void SelectionSort(){ for(int i = 0; i < nElems - 1; i++) { int min = i; for(int j = i + 1; j < nElems; j++) { if(a[j] < a[min]) { long temp = a[j]; a[j] = a[min]; a[min] = temp; } } } } } public class SelectSortApp { public static void main(String[] args){ SelectSort arr = new SelectSort(100); arr.insert(77); arr.insert(99); arr.insert(44); arr.insert(55); arr.insert(22); arr.insert(88); arr.insert(11); arr.insert(00); arr.insert(66); arr.insert(33); arr.display(); arr.SelectionSort(); arr.display(); } }
3.插入排序
package aa; class InsertSort{ private long[] a; private int nElems; public InsertSort(int max){ a = new long[max]; nElems = 0; } public void insert(long value){ a[nElems] = value; nElems ++; } public void display(){ for(int j = 0; j < nElems; j++) { System.out.println(a[j] + " "); } System.out.println(""); } public void insertionSort(){ int out,in; for(out = 1; out < nElems; out++) { long temp = a[out]; in = out; while(in > 0 && a[in-1] >= temp) { a[in] = a[in - 1]; in --; } a[in] = temp; } } } public class InsertSortApp { public static void main(String[] args){ int maxSize = 100; InsertSort arr = new InsertSort(maxSize); arr.insert(77); arr.insert(99); arr.insert(44); arr.insert(55); arr.insert(22); arr.insert(88); arr.insert(11); arr.insert(00); arr.insert(77); arr.insert(77); arr.display(); arr.insertionSort(); arr.display(); } }