重新學習基礎: 用C++寫了一遍快速排序

/*
 * 316-quicksort.cpp
 *
 *  Created on: 2020年5月28日
 *      Author: panzhengji
 */

#include<string>
#include<iostream>

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


void swap(int p_int[], int first , int end){
	int tmp = p_int[end];
	p_int[end]  = p_int[first];
	p_int[first] = tmp;
}

// 從小到大排序
void sort(int p_int[], int start, int end){
	if(!(start<end)){
		return;  // 遞歸函數的出口,只有一個元素了,那說明已經遞歸到了終點,返回結果值
	}

	// 取當前中間的值作爲基準值,放到第一位
	swap(p_int,start,(start+end)/2);

	// current 爲該元素最終的位置,其右側元素都大於等於他,其左側元素都小於等於他
	// current 的值設置爲 start,先假設右側的所有元素都大於等於標準值
    int current = start;

    // for 循環逐一驗證,右側的值,是否符合假設: 都大於等於標準值
    for(int i = start +1; i <= end ; i++){   // start 是標準值, start+1 是第一個檢驗的元素
    	// p[i] 是檢驗的元素   ,  p[start] 是標準值 , 一旦發現不符合的元素,需要變更 current 的位置,以保證其右側大於它,其左側小於它
    	if(p_int[i] < p_int[start]){
    		//swap(p_int,++current,i);   // 這裏註釋掉,不使用這麼難懂的寫法
    		// 這裏加一的原因是: 由於發現一個不符合條件的值,所以先加一,加一後,其左側第一個元素一定是大於等於它的
    	    // 分兩種情況,第一: 如果本身就是初始值 start,那麼符合等於的情況, 如果一旦發生交換後,那麼 current+1 對應的值,也是大於等於的
    		current = current + 1;
    		// 進行交換: 將+1後得到的大於標準值的元素 和  i 小於標準值的元素交換位置,得到的結果就是:current右側的值大於標準值,左側的小於標準值
    		swap(p_int,current,i);
    	}

    }

    swap(p_int,start,current);

    sort(p_int,start,current-1);
    sort(p_int,current+1,end);

}


int main(){
	int p_int[] = {9,3,4,2,3,5,11,45,22};

	cout << "before sort : " << endl;
    for(unsigned int i = 0 ; i < sizeof(p_int)/sizeof(p_int[0]) ; i++){
    	cout << p_int[i] << " " ;
    }

    sort(p_int,0,sizeof(p_int)/sizeof(p_int[0])-1);
//    swap(p_int,0,2);

    cout << endl;
	cout << "after sort : " << endl;
    for(unsigned int i = 0 ; i < sizeof(p_int)/sizeof(p_int[0]) ; i++){
    	cout << p_int[i] << " " ;
    }


}

 

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