JAVA代碼實現快速排序

快速排序

快速排序是一種改進版的冒泡排序。針對一組數據,按從小到大排序爲例。首先隨機選取一個數爲基準(一般選取第一個數或者中間數)然後將數據分成左右兩組,左邊的每個數據都比基準小,右邊的每個數據都比基準大。其實現思路是:

  1. 首先確定基準,然後確定左指針和右指針;
  2. 右指針先往左移動,找出比基準小的數的下標;
  3. 當右指針找到比基準小的數時,左指針開始向右移動,找到比基準打的數的下標;
  4. 如果左指針和右指針沒有重合,就將各自找到的數進行交換位置;
  5. 重複2-4步,直到左右指針重合,一趟排序結束;
  6. 從指針位置分別進行左遞歸和右遞歸操作,直至排序完成。

快速排序的平均時間複雜度爲O(nlogn),最差時間複雜度爲O(n^2)。
我分別試了一下以第一個數、中間數和最後一個數爲基準的方式,如有錯誤,還望指出,我會及時改正。代碼如下:

package com.sort.quickSort;

import java.util.Arrays;

public class QuickSortDemo2 {

	public static void main(String[] args) {
		int[] array = new int[10];
		// 隨機生成10個0~100至今的數
		int count = 0;// 記錄有效的隨機數個數
		boolean flag = true;// 用來標誌的變量
		int num = 0;
		while (count < array.length) {
			num = (int) (Math.random() * 100);
			for (int i = 0; i < array.length; i++) {
				if (num == array[i]) {
					flag = false;
					break;
				}
			}
			if (flag) {
				array[count] = num;
				count++;
			} else {
				flag = true;
			}
		}
		System.out.println("排序前的數組:" + Arrays.toString(array));
		quickSort(array, 0, array.length - 1);

	}

	// 快速排序
	static int count = 0;

	public static void quickSort(int[] array, int begin, int end) {
		if (begin > end) {
			return;
		}
		// 1.將頭尾暫存
		int left = begin;
		int right = end;
		// 2.選擇基準
		int temp = array[begin];// 以第一個數爲基準
		// int temp=array[(begin+end)/2];//以中間數爲基準
		// int temp=array[end];//以最後一個數爲基準
		while (left != right) {
			// 先讓右指針往前移,每次要保證right>left
			// array[right]>temp:每次往前移動的時候,要麼找到比基準小的數,要麼找到基準的位置
			while (left < right && array[right] > temp) {
				right--;
			}
			// 再讓左指針往後移,每次要保證right>left
			// array[left]<temp:每次往後移動的時候,要麼找到比基準大的數,要麼找到基準的位置
			while (left < right && array[left] < temp) {
				left++;
			}
			// 只要左右指針沒有重合,就將兩個指針找到的數互換位置
			// 1.如果左指針找到的數比基準大,右指針找到的數比基準小,互換位置
			// 2.如果左指針找到的是基準的位置,右指針找到的數比基準小,互換位置後,基準的最終位置只會在此或其之前了;
			// 3.如果左指針找到的數比基準大,右指針找到的是基準的位置,互換位置,基準的最終位置只會在此或其之後了;
			// 4.左右指針一旦重合,說明都找到了移動到了基準的位置,就不用了互換位置了
			if (left != right) {
				int i = array[right];
				array[right] = array[left];
				array[left] = i;
			}
		}
		// left和right就重合,表示一趟排序結束
		System.out.println("第" + (++count) + "趟排序後:" + Arrays.toString(array));
		// 分別向左和向右遞歸
		quickSort(array, begin, left - 1);
		quickSort(array, right + 1, end);
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章