package com.java.dataStructArithmeic.sort;
/**
* @author gongpeibao
* @since 2012.03.16
* 基本排序方法
* 選擇排序放比冒泡排序效率高,原因是它的交換次數少了,比較次數都是N*(N-1)/2
* 插入排序法是這兒最好的一種基本排序方法,雖然排序演算法仍然需要O(N^2)的時間,
* 但是一般情況下比冒泡排序快一倍,比選擇排序還要快一點
* 應用方法:
* 在資料量很小,並且交換資料相對於比較資料 更加耗時的情況下,應用選擇排序
* 假設資料量很小或基本上有序時,插入排序演算法是最好的選擇
* 對於大資料量的排序來說,快速排序是最好的方法
*/
public class BubbleSort {
public static void main(String[] args) {
// int[] values = { 3, 1, 6, 2, 9, 0, 7, 4, 5 }; //數組
int[] values = { 3, 1, 6}; //數組
// BubbleSort.bubbleSort(values); //冒泡排序
// selectSort(values); //選擇排序
insertSort2(values); //插入排序
int length = values.length;
for (int i = 0; i < length; i++) {
System.out.println(values[i]);
}
}
/**
* 冒泡排序法
* @param values 排序數組
*/
public static void bubbleSort(int[] values) {
int length = values.length;
// 外面的for迴圈控制趟數
for (int i = 0; i < length; i++) {
// 裡面的for迴圈控制比較次數
for (int j = 0; j < length - i - 1; j++) {
// 滿足條件則交換資料
if (values[j] > values[j + 1]) {
int temp = values[j];
values[j] = values[j + 1];
values[j + 1] = temp;
}
}
}
}
/**
* 選擇排序法
* 交換次數從O(N^2) 降到了O(N)
* @param values 排序數組
* 直接選擇排序演算法的思想比較簡單:(假設資料放在一個數組a中,且數組的長度是N)
* 從a[0]-a[N-1]中選出最小的資料,然後與a[0]交換位置
* 從a[1]-a[N-1]中選出最小的資料,然後與a[1]交換位置(第1步結束後a[0]就是N個數的最小值)
* 從a[2]-a[N-1]中選出最小的資料,然後與a[2]交換位置(第2步結束後a[1]就是N-1個數的最小值)
* 以此類推,N-1次排序後,待排資料就已經按照從小到大的順序排列了。
* */
public static void selectSort(int[] values){
int length = values.length;
for(int i = 0; i < length-1; ++i)
{
int k = i; //記錄第一個元素的位置,作為比較基準
for(int j = i; j < length; ++j)
{
//如果有比基準小的值,則用小的作為新的基準,同時選出最小的值
if(values[k] > values[j])
{
k = j;
}
}
if(k != i)
{
//交換元素
int temp = values[i];
values[i] = values[k];
values[k] = temp;
}
}
}
/**
* 插入排序法
* @param values 排序數組
*/
public static void insertSort(int[] values){
int length = values.length;
for(int i = 1;i <length; i++){
int j = -1;
//找到element[i]應該擺放的位置,此處可以利用尋找演算法進行最佳化
while(j <= i && values[i] > values[++j])
{
System.out.println(values[i]+"-"+values[++j]);
}; //分號,進行空處理
if(j < i){
//將j之後的資料移動一位,然後把values[i]移動到j處
int temp = values[i]; //迴圈把數組第二個值放到temp裡
for(int k = i-1;k >= j;k--){
values[k+1] = values[k];
}
values[j] = temp;
}
}
}
/**
* 插入排序法 方法2更容易理解
* @param values 排序數組
* 不變性
* 每趟結束時,在temp位置的項插入後,比outer小的下標的資料項目都是局部有序的
*/
public static void insertSort2(int[] values){
int length = values.length;
for(int i = 1;i<length;i++){
//迴圈把數組第二個值放到temp裡
int tmp = values[i];
int j = i-1; //從左邊的第一個開始比較
while(tmp<values[j]){ //迴圈
values[j+1] = values[j]; //右移一個
j--;
if(j == -1) //判斷當前元素是否是第一個元素,如果是第一個元素,則停止迴圈
break;
}
values[j+1] = tmp; //將拿出來的那個放到比其小的位置
}
}
}