1. 程式人生 > >java實現8 大排序演算法,不求最簡單,只求最容易理解

java實現8 大排序演算法,不求最簡單,只求最容易理解

8 大排序演算法

排序演算法可以分為內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。

常見的內部排序演算法有:插入排序、希爾排序、選擇排序、氣泡排序、歸併排序、快速排序、堆排序、基數排序等。

ps:在網上看了一些排序演算法的實現方式,程式碼都很簡潔,但或許是思維習慣不同吧,感覺理解起來有些難度,就按照自己的邏輯,重新寫了一遍

1 插入排序

構建有效序列,對未排序的資料依次與已排序的資料比較,找到相應位置並插入

	/**
	 * 插入排序
	 * 1.將第一元素看作有序序列
	 * 2.取出下一個元素,在已排序的序列從後向前掃描
	 * 3.比較:該元素大於新元素(未排序),則將該元素移到下一位置
	 * 4.重複3,直到找到該元素<=新元素,將新元素插入到該位置
	 * 穩定排序
	 * @param array
	 */
public static void insertSort(int[] array) { int length = array.length; int temp = 0; //從第二個元素(1)開始 for (int i = 1; i < length; i++) { //當前迴圈要排序的資料 temp = array[i]; for (int j = i; j >= 0; j--) { //第一個元素,特殊處理 if(j == 0){ array[j] = temp; break; } //資料array[j-1]小於之前的資料時,將此資料後移一位
if(temp < array[j-1]) { array[j] = array[j-1]; }else { array[j] = temp; break; } } } }

2 氣泡排序

重複比較相鄰的資料,如果順序不對,就交換它們的位置,直到最後一組

	/**
	 * 氣泡排序法
	 * 穩定排序
	 * @param array
	 */
	public static void bubbleSort(int[] array) {
		int t =
0; //外層迴圈,每一趟將相對最大的資料放在後面 for (int i = 0; i < array.length - 1; i++) { //內層迴圈,比較相鄰資料,最終把最大的元素放在後面 for (int j = 0; j < array.length -1 - i; j++) { if(array[j] > array[j+1]){ t = array[j]; array[j] = array[j+1]; array[j+1] = t; } } } }

3 快速排序

選定一個基準值,將比基準值小的排到左側,大的排到右邊,再分別對兩部分進行排序,直到整個序列有序

ps:為方便理解,隨便定義一個概念
空位:即賦值過程中值被賦予其它位置的資料所在位置,此時該位置資料已被複制,因此變得可有可無,可視為空

	/**
	 * 快速排序
	 * 不穩定排序
	 * @param array
	 */
	public static void quickSort(int[] array) {
		if(array.length > 0){
			quickSort(array, 0, array.length - 1);
		}
		
	}

	private static void quickSort(int[] array,int left, int right) {
		if(left < right){
			int middle = getMiddle(array,left,right);
			quickSort(array, left, middle - 1);
			quickSort(array, middle + 1, right);
		}
		
	}
	
	 

	/**
	 * 獲取新的中軸值,並進行資料交換
	 * @param array
	 * @param left
	 * @param right
	 * @return
	 */
	private static int getMiddle(int[] array, int left, int right) {
		//記錄中軸值
		int temp = array[left];
		
		//每一次迴圈完成左右兩個資料的交換,中軸改變
		while(left < right){
			//迴圈比較中軸值和右側資料,直到找到比中軸值小的資料
			while(left < right && array[right] >= temp){
				//遞減,直到找到空位(空位資料將被賦給中軸,左側較大資料會被賦給空位,中軸資料會被賦給新的中軸(即左側較大資料位置) )
				//右空-中,左大-右空,中-左大,左大變成新中軸
				//ps:隨便定義一個概念,空位:即複雜賦值過程中值被賦予其它位置的資料所在位置,此時該位置資料已被複制,因此變得可有可無
				right--;
			}
			
			//比中軸小的移到左側,即:將比中軸值小的值(空位資料)賦給中軸位置
			//右空-中
			array[left] = array[right];
			
			//迴圈比較中軸值和左側資料,直到找到比中軸大的資料
			while(left < right && array[left] <= temp) {
				//中軸位置改變
				left++;
			}
			//比中軸大的移到右側,即:將左側較大資料賦給右側空位
			//左大-右空
			array[right] = array[left];
		}
		//中軸記錄到尾:中軸資料賦給新的中軸
		array[left] = temp;
		return left;
	
	}

穩定:相同大小的資料在排序後順序不變

在這裡插入圖片描述

參考:圖文帶你瞭解 8 大排序演算法

參考:java實現8種排序演算法