我們來了解一下Java中常見的三種排序方式,這裏我們說的是
1.冒泡排序
2.選擇排序
3.插入排序
排序中要考慮到的主要因素是時間複雜度和空間複雜度,時間我們可以用
System.currentTimeMillis()這個來查看。
下面我們依次來說明:
1、冒泡排序
所謂冒泡排序就是從前到後遍歷選出最大值放到最後一個,然後在遍歷剩下的找出剩
下中最大的放到倒數第二個,依次直至遍歷到最後一個,也就是最小的放到第一個,
使其有序。下面我們來舉例說明:
private static void bubbleSort(int[] array) {
//冒泡排序
/*
* 穩定: 沒有跳躍的比較,所以比較穩定
* 時間複雜度:o(n^2)
*/
// TODO Auto-generated method stub
System.out.println(System.currentTimeMillis());//程序執行的時間
int tmp=0;
for(int i=0;i<array.length;i++){//趟數
for(int j=0;j<array.length-1-i;j++){//比較的次數
if(array[j+1]<array[j]){
tmp=array[j];
array[j]=array[j+1];
array[j+1]=tmp;
}
}
}
System.out.println(System.currentTimeMillis());
}
public static void main(String[] args) {
//冒泡排序
//int[] array={12,43,2,1,54,76};
int[] array=new int[10000];//隨機生成一萬個數據;
for(int i=0;i<array.length;i++){
array[i]=i;
}
bubbleSort(array);
System.out.println(Arrays.toString(array));
}
這裏要說明的是這裏有兩個for循環嵌套,其中第一個for循環是控制比較的趟數(每一趟選出一個最大值),第二個for是比較的次數(比較相鄰兩個是中較大的值)。
但這個冒泡排序是有缺憾的,是可以優化的。這裏我們說一個簡單的優化,如果原來的數組就是有序的,那這個排序還是會選擇每一個比較,時間複雜度會很大,於是我們可以這麼優化:
在第二個for設計一個int類型標誌flg定義爲0,如果發生交換,那麼flg++,如果flg結果爲0,說明沒有發生交換,那麼數組本身就是有序的。函數如下:
public static void newbbsort(int[] array){
System.out.println(System.currentTimeMillis());
int tmp=0;
for(int i=0;i<array.length;i++){//趟數
int flg=0;
for(int j=0;j<array.length-1-i;j++){//比較的次數
if(array[j+1]<array[j]){
flg++;
tmp=array[j];
array[j]=array[j+1];
array[j+1]=tmp;
}
}
if(i==0&&flg==0)
{
break;
}
}
System.out.println(System.currentTimeMillis());
}
2、選擇排序
選擇排序就是從第一趟開始,用第一個元素和剩下中的每一個元素比較,如果比第一個小,就和第一個元素交換值,最後使得第一個元素中的值最小,第二趟選擇出第二小的放到第二元素,依次,使得數組有序。下面我們舉例說明:
public class Test7 {
public static void main(String[] args) {
int[] array={23,45,2,3,657,8};
selectSort(array);
System.out.println(Arrays.toString(array));
}
public static void selectSort(int[] array){
int min;
int tmp;
for(int i=0;i<array.length;i++){
min=i;
for(int j=i;j<array.length;j++){
if(array[j]<array[min]){
min=j;//選出最小值下標
}
}
/*
* 將第一個元素和最小值交換
*/
tmp=array[i];
array[i]=array[min];
array[min]=tmp;
}
}
}
如同冒泡排序一般,第一個for循環控制趟數,第二個for循環控制每一趟中比較的次數。
3、直接插入排序
插入排序類似於打撲克牌,從第二張牌開始插入,小的插到大的前面,然後使其有序。再拿第三張牌來,找到合適的位置繼續插入,使這三張有序。在第四張直至全部插入有序。舉例說明:
public class Test7 {
public static void main(String[] args) {
int[] array={23,45,2,3,657,8};
InsrtSort(array);
System.out.println(Arrays.toString(array));
}
public static void InsrtSort(int[] array){
//不穩定
int temp;
int j;
for(int i=1;i<array.length;i++){
temp = array[i];//從i號位置開始進行排序。
for(j=i-1;j>=0;j--){
if(array[j]>temp){
array[j+1]=array[j];
}else {//每次排序過後前面已經有序,找到第一個比temp小的。
break;
}
}
array[j+1]=temp;
}
}
}