冒泡排序、選擇排序、直接插入排序

我們來了解一下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;
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章