1. 程式人生 > >八大排序演算法 之 快速排序(填坑法)

八大排序演算法 之 快速排序(填坑法)

排序思想:

1,將第一個數字作為基準數字,將陣列分為左右兩部分,左邊是比它小的數字,右邊是比它大的數字;

2,將左部分按照上面的思想再次進行劃分成兩部分,依次類推;

3,將右部分按照上面的思想再次進行劃分成兩部分,依次類推;

排序趟數:

不確定

排序原理:

填坑法:

1,將第一個數字作為基準數字拿出,留下一個坑,從陣列的最後開始往前迴圈,發現比基準數字小的就把它填到之前留下的坑裡,從而在右側得到一個新坑;

2,再從陣列的頭部開始迴圈查詢,發現比基準數字大的,就將它填到之前後面數字被拿走留下的坑裡,從而在左側得到一個新坑;

3,如此往復,知道中間部位,將基準數字放到中間,完成一輪迴圈

參考圖片:


程式碼實現如下:

//快速排序主方法
	public static void quickSort(int[] array, int low, int high){
		if (low < high) {
			int mid = findMid(array, low, high);//將第一個數作為基準,將陣列分成前後兩部分
			quickSort(array, low, mid - 1);//遞迴呼叫將左半部分再一次往下分,直至左半部分完成排序
			quickSort(array, mid + 1, high);//遞迴呼叫將右半部分再一次往下分,直至右半部分完成排序
		}
	}
	//將第一個數作為基準,將陣列分成前後兩部分--填坑法
	public static int findMid(int[] array, int low, int high){
		int temp = array[low];//將第一個數作為基準拿出,拿出留下一個坑
		while (low < high) {
			while (low < high && temp <= array[high]) {//從右開始找
				high --;
			}
			if (low < high) {//發現比基準數字小的,就把它填到之前基準數字留下的坑裡
				array[low ++] = array[high];
			}
			
			while (low < high && temp >= array[low]) {//從左開始找
				low ++;
			}
			if (low < high) {//發現比基準數字大的,就把它填到之前被拿出數字留下的坑裡
				array[high --] = array[low];
			}
		}
		array[low] = temp;//將基準數字放到中間將左右分成兩部分
		return low;//返回基準數字的下標
	}



相關推薦

八大排序演算法 快速排序

排序思想: 1,將第一個數字作為基準數字,將陣列分為左右兩部分,左邊是比它小的數字,右邊是比它大的數字; 2,將左部分按照上面的思想再次進行劃分成兩部分,依次類推; 3,將右部分按照上面的思想再次進行劃分成兩部分,依次類推; 排序趟數: 不確定 排序原理: 填坑法: 1,將

排序演算法快速排序關鍵詞:資料結構/演算法/排序演算法/快速排序

快速排序 實現 def partition(nums, left, right): middle = (left+right) // 2 pivot = nums[middle] swap(nums, middle, right) # 現在主元 pivot 等於 num

資料結構排序演算法快速排序c語言實現

快排的原理就是通過一趟排序將待排記錄分割成獨立的兩部分,其中的一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。這其中,可以使用遞迴呼叫某一關鍵函式的辦法來實現這樣的功能。 分割的方法就是,選取一個樞軸,將所有關鍵字比它

經典排序演算法--快速排序

快速排序是一種高效但不穩的排序演算法,不穩性取決於比較基數的選擇帶有隨機性,其排序原理應用百度百科如下: 設要排序的陣列是A[0]……A[N-1],首先任意選取一個數據(通常選用陣列的第一個數)作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排

c#程式碼實現排序演算法快速排序

快速排序的平均時間複雜度為O(nlog2n),最好時間複雜度為O(nlog2n),最壞時間複雜度為O(n²),空間複雜度為O(log2n),是一種不穩定的演算法。 1.劃分:選定一個記錄作為軸值,以軸值為基準將整個序列劃分為兩個子序列r(1)…r(i-1)和r(i+1)…r(n)

常見排序演算法快速排序

文章目錄 前言 思路 實現過程 基本演算法 切分方法 複雜度分析 最優時間複雜度的數學證明 演算法改進 切換到插入排序 三取樣切分 三向

PHP排序演算法快速排序

原理:找到當前陣列中的任意一個元素(一般選擇第一個元素),作為標準,新建兩個空陣列left、rignt,遍歷整個陣列元素,如果遍歷到的元素比當前的元素小就放到陣列left,比當前的元素大放到rignt,然後再對新陣列進行同樣的操作。 遞迴:遞迴是一種函式呼叫自身的機制。遞迴必須要有邊界條件,也就是遞迴出口(

排序演算法快速排序【java實現】

快速排序是最常用的排序演算法之一,它的平均時間複雜度是O(nlogn),但是它是一個不穩定的演算法。 步驟: 我們要找到一個基值,將小於基值的放在它的左邊,大於它的放在它的右邊。基值我們直接用陣列最左邊的值就行。每次排序會把基值放在正確的位置上,在根據這個值把陣列分成左右兩部分,在進行遞迴處

java版排序演算法快速排序

快速排序的思想 快速排序是通過切分的方式將大陣列切分為左右兩個子陣列,分別對兩個子陣列進行遞迴的切分,當左右兩個子陣列都有序時整個陣列便有序了。 程式碼實現 public clas

排序演算法快速排序的非遞迴實現

在之前的部落格中提到過快速排序的三種實現方式,不過都是通過遞迴來實現,今天我們將會利用棧來實現快速排序。 -----------------------------------Stack.h----------------------------------------

排序演算法快速排序,氣泡排序用python程式碼實現

一、快速排序 1.在列表中選出一個基準數(通常為列表的第一個數) 2.將列表中小於基準數的資料移到基準列表的左邊,將大於基準數的資料移到基準數的右邊 3.對於基準數左,右兩邊的列表,不斷重複以上兩個過程,直到每個子集只有一個元素, 即為全部有序的. def qu

資料結構與演算法——排序演算法快速排序

資料結構與演算法——排序演算法之快速排序 快速排序定義 快速排序由C. A. R. Hoare在1962年提出通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行

排序演算法快速排序

快速排序: 通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字比另一部分記錄的關鍵字小,則可以分別對這兩部分記錄繼續進行排序,以達到整個序列有序的目的。 快速排序的時間複雜度,最好情況和平均情況為O(n * lgn ),最差情況下為O(n ^ 2),空間複雜

看圖說話排序演算法快速排序

  排序演算法(二) 本文著重介紹快速排序演算法(quick sort),快速排序和氣泡排序一樣是交換排序的一種,快速排序演算法可以看成是對氣泡排序演算法的改進演算法,其平均時間複雜度在nlog(n)

資料結構排序演算法快速排序

快速排序#include<iostream> using namespace std; void swap(int arr[], int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = tem

Java實現排序演算法快速排序

一、綜述        快速排序是交換排序中的一種,平均演算法複雜度是O(nlogn),最壞O(n*n)。下面用Java實現一個快速排序,並用註釋的方式解釋了思想和原理。 二、Java實現堆排

java 排序演算法快速排序(挖坑)

快速排序是(挖坑法)是挖坑填數 + 分治來實現。快速排序的基本思想:     1.先從數列中取出一個數作為基準數。     2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。     3.再對左右區間重複第二步,直到各區間只有一個數。直接上程式碼

排序演算法快速排序以及優化

顧名思義,就是一種速度特別快的快速排序也叫分割槽排序,是目前應用最廣泛的排序演算法,人如其名,就是很快,而且快速排序演算法在空間上只使用一個小的輔助棧,其內部迴圈也很小,另外快排很容易實現,消耗的資源也很小。 【基本思想】 (1)任取待排序元素序列中的某個元素(例如取第一

排序演算法快速排序和歸併排序

申明:此博文轉自他人,感覺不錯特轉載供大家分享 摘要:一般評判排序演算法的標準有時間代價,空間代價和穩定性。本文主要討論性質相對比較好且作者喜歡的快速排序演算法和歸併排序演算法,並對此這做了一定比較。 正文: 常見的排序演算法大致分為四類: 1.插入排序

排序演算法 快速排序 及其時間複雜度和空間複雜度

原文:http://blog.csdn.net/yuzhihui_no1/article/details/44198701 總結: 最好的情況是樞紐元選取得當,每次都能均勻的劃分序列。 時間複雜度O(nlogn)最壞情況是樞紐元為最大或者最小數字,那麼所有數都劃分到一個序