1. 程式人生 > 資訊 >華為 MatePad Pro 新品爆料:搭載麒麟 9000 和驍龍 870 4G

華為 MatePad Pro 新品爆料:搭載麒麟 9000 和驍龍 870 4G

快速排序的演算法,說一下快速排序的思想。從陣列中找一個數作為基準(一般就是陣列第一個元素)。小於基準的數放到陣列前面,大於基準的數放到陣列後面。陣列變成 小 |基準| 大。然後比基準小的陣列成新的陣列,繼續用這種方法處理排序(基準是新陣列的第一個元素)比基準大也是同樣處理的。容易想到當基準前只有一個數則比基準小的部分排序完成,同理。當基準後只有一個數則比基準大的部分排序完成。這就是排序完成退出條件
演算法大致是這樣一個過程,首先我把第一個元素拿出來作為基準了。此時我的陣列第一個元素的位置可以說為 “空” 。然後我從陣列末尾(用right來表示下標)開始比較。
1、末尾值比基準小,交換開頭(lift)和末尾(right)的元素。這時候末尾是基準。開頭是比基準小的數。是不是比基準小的在基準前面吧,對吧
2、要是末尾比基準大呢,那就陣列末尾(right)減一。和倒數第二個比較。直到交換一次或者已經比較到了最開始了(也就是第一個元素(基準)比後面的都小)。如果比較到了最開始了,那沒說的,對基準後面的元素繼續按著這個流程走,選基準------比較------分出大小。
說說交換了一次後該怎麼做。交換完後。這時候末尾是基準。開頭是比基準小的數。然後陣列開頭(lift)加一,比較陣列第開頭lift個元素和基準大小。也是兩種情況。
1、lift比基準大。交換開頭(lift)和末尾(right)的元素。這時候的開頭(lift)是基準。末尾(right)是比基準大的數。是不是比基準大的在基準後面吧,對吧
2、lift比基準小。lift加一然後繼續比較。直到交換了一次或者發現比較完了(lift==right)開頭等於末尾了。如果開頭等於末尾了。那就完成了完成一次大小分堆了。如果是交換 一次。那麼這時候的開頭(lift)是基準。末尾(right)是比基準大的數。right減一,繼續比較。直到(lift=right)就代表以這個基準的大小分堆完成。
可能講的不太好懂,舉個例子 ,a={15,7,4,11,3,6} 選15為基準,lift=0 right=5(這兩個都是下標)從末尾right開始找,6比15 小,交換。變成a={6,7,4,11,3,15} 。lift加一,7不比15 大。lift繼續加一,加到right=4的時候,3還是不比15 大。lift繼續加一,right=5=lift,好的,這次的以15 為基準的大小分堆完成。繼續對基準前後的元素進行排序。發現基準後面沒有,就不用排了。
對{6,7,4,11,3}處理,選6作為基準, lift=0 right=4,也是從末尾right開始找,3比6小,交換,變成{3,7,4,11,6},left加一,7比6大,交換,變成{3,6,4,11,7},right減一。11比6大,right繼續減一,4比6 小,交換。變成{3,4,6,11,7},lift加一,此時lift=right=2。這次的以6 為基準的大小分堆完成。繼續對基準前後的元素進行排序。直到發現基準前面只有一個數,則整個排序完成

#include<iostream>

using std::endl;
using std::cin;
using std::cout;

//快速排序
void quick_sort(int nums[], int _left, int _right) {
	int left = _left;
	int right = _right;
	int temp = 0;
	if (left < right) {                                      //如果排序的元素至少有兩個則開始排序,只有一個?直接返回了
		temp = nums[left];                                    //待排序的第一個元素作為基準元素
		while (left != right) {                               //從左右兩邊交替掃描,直到left = right
			while (right > left && nums[right] >= temp) {
				right--;                                      //從右往左掃描,找到第一個比基準元素小的元素
			}			
			nums[left] = nums[right];                         //找到這種元素nums[right]後與nums[left]交換
			while (left < right && nums[left] <= temp) {
				left++;                                       //從左往右掃描,找到第一個比基準元素大的元素
			}
			nums[right] = nums[left];                         //找到這種元素nums[left]後,與nums[right]交換		
		}
		nums[right] = temp;                                   //基準元素歸位
		cout << "------------------------------" << endl;
		for (int ix = _left; ix <= _right; ix++) {
			cout << nums[ix] << endl;
		}
		quick_sort(nums, _left, left - 1);                     //對基準元素左邊的元素進行遞迴排序
		quick_sort(nums, right + 1, _right);                   //對基準元素右邊的進行遞迴排序
	}
}
int main()
{
	int num[8]={ 125, 21, 4, 58, 7, 42, 67, 19 };
	int len= sizeof(num) / sizeof(num[0]);
	quick_sort(num, 0,len-1);
	cout << "------------------------------" << endl;
	for (int ix = 0; ix < len; ix++) {
		cout << num[ix] << endl;
	}
	return 0;
}

選擇排序 :https://blog.csdn.net/qq_43657442/article/details/103716989

插入排序 :https://blog.csdn.net/qq_43657442/article/details/103717359

氣泡排序 :https://blog.csdn.net/qq_43657442/article/details/103716226