18、快速排序(代碼)

先分享個視頻教學網址,講的很nice! https://www.bilibili.com/video/BV1it41167v2?from=search&seid=7944545082422790984

  • 概念
快速排序的基本思想:通過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。
  • 思路:
快速排序使用分治法來把一個串(list)分爲兩個子串(sub-lists)。具體算法描述如下:

1、從數列中挑出一個元素,稱爲 “基準”(pivot);
2、重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分區退出之後,該基準就處於數列的中間位置。這個稱爲分區(partition)操作;
3、遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
  • 代碼
package Sort;

import java.util.Arrays;

public class QuickSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		QuickSort quickSort = new QuickSort();
		int[] arr = {9,6,0,2,5,2,7,1,8};
		quickSort.quickSort(arr, 0, arr.length - 1);
		System.out.println(Arrays.toString(arr));

	}
	
	/**
	 * 我們將數組的第一個元素當做基準 pivot
	 * @param arr   待排數組
	 * @param left  左邊的索引值(最小的索引值)
	 * @param right 右邊的索引值(最大的索引值)
	 */
	public void quickSort(int[] arr, int left, int right) {
		if(left > right) {
			return;
		}
		//定義基準值:規定將數組第一個元素當做基準pivot
		//此時,應該先進行右遍歷,再進行左遍歷,否則兩個索引值相遇時,指向的元素比基準大。
		int pivot = arr[left];
		//首先定義一個變量,用來當左索引
		int i = left;
		//定義一個變量用來當右索引
		int j = right;
		//定義個臨時變量,用於元素交換
		int temp;
		
		
		//開始進行右左索引
		while(i != j) {
			
			//先進行右索引,直到找到比pivot小的元素
			while(i < j && arr[j] >= pivot) {
				j--;
			}
			//然後進行左索引,直到找到比pivot大的元素
			while(i < j && arr[i] <= pivot) {
				i++;
			}
			
			//此時,兩者應該同時找到符合要求的元素了,將i和j指向的元素進行交換
			temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;			
		}
		
		//此時,i和j指向同一個元素,將這個元素和基準元素進行交換
		arr[left] = arr[i];
		arr[i] = pivot;
		
		//此時,一遍快排完成,
		//同時,對由基準劃分的左右兩個數組分別進行快排
		quickSort(arr, left, i-1);
		quickSort(arr, i+1, right);	
	}

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