資料結構與演算法 基礎排序

mic_saber發表於2019-03-28

排序是演算法的基礎

目錄

基礎排序

選擇排序

插入排序

希爾排序


基礎排序

選擇排序

  • 首先,找到陣列中最小的那個元素
  • 其次,將它和陣列的第一個元素交換位置(如果第一個元素就是最小元素那麼它就和自己交換)
  • 再次,在剩下的元素中找到最小的元素,將它與陣列的第二個元素交換位置。如此往復,直到將整個陣列排序。這種方法叫做選擇排序,因為它在不斷地選擇剩餘元素之中的最小者。

插入排序

  • 人們整理橋牌的方法是一張一張的來, 將每一張牌插入到其他已經有序的牌中的適當位置。
  • 在計算機的實現中,為了給要插入的元素騰出空間,我們需要將其餘所有元素在插入之前都向右移動一位。

希爾排序

  • 希爾排序的思想是使陣列中任意間隔為h的元素都是有序的。這樣的陣列被稱為h有序陣列。
  • 換句話說,一個h有序陣列就是h個互相獨立的有序陣列編制在一起組成的一個陣列。在進行排序的時候,如果h很大,我們能夠將元素移動到很遠的地方,為了實現更小的h有序創造方便,用這種方式,對於任意以1結尾的h序列,我們都能夠將陣列排序,這就是希爾排序。
     
public class Sort {
	public static void main(String[] args) {
		int[] c = { 3, 2, 1, 6, 5, 7 };
		print(c);
//		selectionSort(c);
//		insertSort(c);
		shellSort(c);
	}

	static void selectionSort(int[] c) {
		for (int i = 0; i < c.length; i++) {
			int min = i;
			for (int j = i + 1; j < c.length; j++) {
				if (c[j] < c[min]) {
					min = j;
				}
			}
			int temp = c[i];
			c[i] = c[min];
			c[min] = temp;
		}
		print(c);
	}

	static void insertSort(int[] c) {
		for (int i = 0; i < c.length; i++) {
			int now = i;
			for (int j = i - 1; j >= 0; j--) {
				if (c[j] > c[now]) {
					int temp = c[j];
					c[j] = c[now];
					c[now] = temp;
					now = j;
				}
			}
		}
		print(c);
	}

	static void shellSort(int[] c) {
		int step = 1;
		while (step < c.length / 3) {
			step = step * 3 + 1;
		}

		while (step >= 1) {
			for (int i = 0; i < c.length; i++) {
				int now = i;
				for (int j = i - step; j >= 0; j = -step) {
					if (c[j] > c[now]) {
						int temp = c[j];
						c[j] = c[now];
						c[now] = temp;
						now = j;
					}
				}
			}
			step =step-1;
		}
		print(c);
	}
	

	static void print(int[] c) {
		for (int i : c) {
			System.out.print(i + " ");
		}
		System.out.println();
	}
}

 

相關文章