冒泡排序,選擇排序,插入排序
小規模的文件以及基本有序的文件,插入排序的性能比快速排序的性能更爲有效一些,實際上,插入排序通常也做快速排序實現的一部分。
1 冒泡排序:
package datastrut;
public class BubbleSort {
/**
* 冒泡排序
* @param args
*/
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.print(a[i] + " ");
System.out.println(" ");
}
public void swap(int one,int two){
long temp = a[one];
a[one] = a[two];
a[two] = temp;
}
public void bubbleSort(){
int out,in;
for(out = nElems-1;out>1;out--){
for(in = 0 ; in < out; in++){
if(a[in]>a[in+1]){
swap(in,in+1);
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generatedmethod stub
int maxsize = 100;
BubbleSort b= new BubbleSort(maxsize);
b.insert(12);
b.insert(45);
b.insert(65);
b.insert(34);
b.insert(76);
b.insert(13);
b.insert(15);
b.insert(78);
b.insert(67);
b.insert(76);
b.display();
b.bubbleSort();
b.display();
}
}
效率:(n-1)+(n-2)+…+1= n*(n-1)/2 大約 O(n^2)
比較次數大約:n^2/2 交換次數:n^2/4
2,選擇排序:
冒泡排序的一種改進,交換次數從O(n^2)減少到O(n),但比較次數仍爲O(n^2)
/*
* 選擇排序
* */
public void selectSort(){
int min,out,in;
for(out = 0;out < nElems - 1; out++){
min = out;
for(in = out + 1; in < nElems;in++){
if(a[in] > a[min])
swap(in,min);
}
}
}
選擇排序的效率:O(n^2)
交換次數從O(n^2)減少到O(n),但比較次數仍爲O(n^2)
當N值較小時,特別是如果交換的時間級比比較時間級大得多時,選擇排序實際上是相當快的。
3,插入排序
仍然需要O(n^2) ,但是一般情況下,它要比冒泡排序快一倍,比選擇排序還要快一點。
/*
* 插入排序
* */
public void insertSort(){
int in,out;
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;
}
}
插入排序性能:對於已經有序或者基本有序的數據來說,插入排序要好得多。當數據有序的時候,while循環的條件總是假,所以他變成了外層循環中的一個簡單語句,執行n-1次,O(n)。
如果數據基本有序,插入排序幾乎只需要O(n)的時間。
三種性能比較:
1, 冒泡:數據量小的時候。交換O(n^2),比較O(n^2)
2, 選擇:數據量小,交換數據相對於比較數據更加耗時時。交換O(n),比較O(n^2)
3, 插入:數據量小或者基本有序時。複製O(n^2),比較O(n^2) 一次複製與一次交換的時間耗費不同。
都需要一個額外的變量來暫時存儲交換時的數據項。