1. 程式人生 > >C++泛型程式設計 快速排序的函式模板實現

C++泛型程式設計 快速排序的函式模板實現

說在前面的廢話

話說快一年沒寫過部落格了。。。
在建站之前就先用csdn寫吧

這次要說的東西也沒有啥,主要是想寫一次快排(學了這麼就快排都沒寫過你敢信

用法類似於stl裡面的sort,有兩個版本。

不知道為什麼寫了很長時間。。。這麼短的程式碼
還是感覺陣列版的好寫一點

學過快排的同學可以不用看下面這段了

快排的基本思想

1.選取一個基準
2.將比它”小”的放在它前面,比他“大”的放在後面(廣義的小和大)
3.遞迴處理前面那一段和後面那一段

實現步驟

函式傳入的是指向第一個元素的迭代器(begin)和指向最後一個元素後一個的迭代器(end)
還可以傳入一個比較函式(c

omp)

考慮快排的操作:

1.選定一個基準

我們選擇第一個元素的值作為排序的基準,把它的迭代器記作 temp
然後記錄一前一後兩個迭代器,記作front和back。

2.整理

每一輪,我們用back迭代器從後向前遍歷,直到當前元素的值小於temp指向元素的值,然後交換他們的值,並讓temp指向現在的位置再使back向前移動一次;隨後對front迭代器進行類似的操作。

持續進行上面的操作,直到front和back間沒有元素,即所有元素都被遍歷過。

3.遞迴處理

temp所在的元素已經是其應該在的位置,所以只需要處理begin~temp 和 temp+1~end這兩個區間的

程式碼

#include <iostream>
#include <vector>

using namespace std;

template <typename _T>
void _swap(_T& _a, _T& _b)
{
    _T temp = _b;
    _b = _a;
    _a = temp;
}

template <typename _Random_Access_Iterator>
void my_quick_sort(_Random_Access_Iterator _begin, _Random_Access_Iterator _end)
{
    if
(_end - _begin <= 1) return; _Random_Access_Iterator _temp = _begin; _Random_Access_Iterator _front = _begin; _Random_Access_Iterator _back = _end - 1; while (true) { while (_back - _front >= 0) { if (*_back < *_temp) { _swap(*_back, *_temp); _temp = _back; _back--; break; } _back--; } while (_back - _front >= 0) { if (*_temp < *_front) { _swap(*_temp, *_front); _temp = _front; _front++; break; } _front++; } if (_back - _front < 0) break; } my_quick_sort(_begin, _temp); my_quick_sort(_temp + 1, _end); } template <typename _Random_Access_Iterator, typename _Compare> void my_quick_sort(_Random_Access_Iterator _begin, _Random_Access_Iterator _end, _Compare _comp) { if (_end - _begin <= 1) return; _Random_Access_Iterator _temp = _begin; _Random_Access_Iterator _front = _begin; _Random_Access_Iterator _back = _end - 1; while (true) { while (_back - _front >= 0) { if (_comp(*_back, *_temp)) { _swap(*_back, *_temp); _temp = _back; _back--; break; } _back--; } while (_back - _front >= 0) { if (_comp(*_temp, *_front)) { _swap(*_temp, *_front); _temp = _front; _front++; break; } _front++; } if (_back - _front < 0) break; } my_quick_sort(_begin, _temp, _comp); my_quick_sort(_temp + 1, _end, _comp); } template<typename _T> bool compare(const _T& a, const _T& b) { return a > b; } int main(int argc, char** argv) { vector<int> a={95,1,4,2,6,9,3,6562,324,54,32243,123,43,657457,100,43}; my_quick_sort(a.begin (), a.end (), compare<int>); for (auto i : a) { cout << i << endl; } size_t t; cin >> a[1]; return 0; }

相關推薦

C++程式設計 快速排序函式模板實現

說在前面的廢話 話說快一年沒寫過部落格了。。。 在建站之前就先用csdn寫吧 這次要說的東西也沒有啥,主要是想寫一次快排(學了這麼就快排都沒寫過你敢信 用法類似於stl裡面的sort,有兩個版本。 不知道為什麼寫了很長時間。。。這麼短的程式碼 還是感

C++程式設計學習(三)——類模板

目錄 目錄 前言 類模板例項 類模板小結 總結 前言 C++泛型程式設計學習(二)——類模板中已經介紹瞭如何在一個檔案中,把類模板的方法和實現分開,這裡主要記錄下類模板的宣告和定義分別寫在標頭檔案中的方法。 類模板例項 功能:實現一

C++程式設計:函式模板與類模板

泛型程式設計是一種語言機制,通過他可以實現一個標準的容器庫,可以處理不同的資料型別. 比如對棧的描述: class stack { push(引數型別)//入棧 pop(引數型別)//出棧 } 由於上面的程式碼與資料型別有關,可以通過模板實現一個程式碼處理不同的資料型別。 首先執行一種通

C++Primer_Chap16_模板程式設計_List03_過載和模板_筆記

  函式模板可以被另一個模板或普通非模板函式過載。與往常一樣,名字相同的函式必須具有不同數量和型別的引數。涉及函式模板,函式匹配規則會在以下幾方面受到影響: 對於一個呼叫,其候選函式包括所有模板實參推斷成功的函式模板例項 候選的函式模板總是可行的,因為模板實參推斷會排除任何

C++Primer_Chap16_模板程式設計_List04_可變引數模板_筆記

  一個可變引數模板(variable template)就是一個接受可變數目引數的模板函式或模板類。可變數目的引數被稱為引數包(parameter packet)。存在兩種引數寶: 模板引數包(template parameter packet),表示0個或多個模板引數

C/C++ 程式設計vector(排序

題目描述 對一組輸入的資料(0結束)進行排序輸出。 約定:所有的輸入資料都為正整數,且都不大於100000。 輸入 包括多組測試資料。 每組以0結尾。 輸出  每組輸出1行。輸出排序後的資料(不含0)。 樣例輸入 1 2 3 2 4 0 5 6 2 2 0

C++ 程式設計(國名排序

題目描述 問題描述:小李在準備明天的廣交會,明天有來自世界各國的客房跟他們談生意,小李要儘快的整理出名單給經理,你能幫他把客戶來自的國家按英文字典次序排好嗎? 例如小李手上有來自加拿大,美國,中國的名單,排好的名單應是美國,加拿大,中國 。 輸入 第1行為一個n(n&

Visual Studio2010新特性--C++王者歸來(3-程式設計-轉移建構函式

                泛型程式設計(generic programming)關注於產生通用的軟體元件,讓這些元件在不同的應用場合都能很容易地重用。在c++中,類模板和函式模板是進行泛型程式設計極為有效的機制。什麼是臨時物件?定義:當且僅當離開一段上下文(context)時在物件上執行的僅有的操作是解

C++ 程式設計vector(成績排序

題目描述 定義學生結構體,包括學號、及三門功課的成績和總分,按照總分從小到大輸出學生學號、總分和各門功課的成績。如果總分相同,就按第1門課的分數小到大輸出;如果第1門課的分數相同,就按第2門課的分數小到大輸出; 輸入 輸入包含n(n<20)個學生的資訊, 第1行學

關於C++程式設計模板宣告和定義最好在同一個檔案的解釋。

關於C++泛型程式設計 模板的 宣告和實現 不能分離的原因: 1.泛型-模板 template 2.模板不是變數,模板就是模板。 3.模板需要例項化成類,就像是行內函數進行替換一樣,替換模板變數 template<typename  T> 4.編譯過程     

C++ 實用程式設計之 虛擬函式C++ virtual function)雜談

一 C++虛擬函式(C++ virtual function)雜談 我們在程式設計的時候,經常會遇到這樣的情況,假設有兩個物件,你要在函式中分別呼叫它們的OnDraw方法,我們以前的做法一般是這樣的。 void f(int iType) {  switch(iType)

C++ 程序設計與STL模板庫(1)---程序設計簡介及STL簡介與結構

urn 向上 隊列 是把 鏈表 需要 input stack 特定 泛型程序設計的基本概念 編寫不依賴於具體數據類型的程序 將算法從特定的數據結構中抽象出來,成為通用的 C++的模板為泛型程序設計奠定了關鍵的基礎 術語:概念 用來界定具備一定功能的數據類型。例如:

c++ 程式設計

C++ 泛型程式設計與STL模板庫(1)---泛型程式設計簡介及STL簡介與結構 泛型程式設計的基本概念 編寫不依賴於具體資料型別的程式 將演算法從特定的資料結構中抽象出來,成為通用的 C++的模板為泛型程式設計奠定了關鍵的基礎 術語:概念 用來界定具備一

C++程式設計

面向物件程式設計關注資料,泛型程式設計關注演算法。 模板和迭代器:都是STL通用方法的組成部分,模板讓演算法獨立於資料型別,迭代器讓演算法獨立於容器型別。例如,對於在陣列和在連結串列中查詢特定值節點的find函式,模板提供了儲存在容器中的資料型別的通用表示,還需要提供遍歷容

C/C++ 程式設計stack(括號匹配)

題目描述 假設表示式中包含一種括號:圓括號,其巢狀順序隨意,即(()())或(())等為正確的格式,)(或((())或())均為不正確的格式。檢驗括號是否匹配可以用堆疊來實現當遇到 ( 時進棧,遇到 ) 時出棧進行匹配檢驗,如果出現不匹配的情況立即結束,否則繼續取下一個字元

C++ 程式設計(單詞數)

題目描述 lily的好朋友xiaoou333最近很空,他想了一件沒有什麼意義的事情,就是統計一篇文章裡不同單詞的總數。下面你的任務是幫助xiaoou333解決這個問題。 輸入 有多組資料,每組一行,每組就是一篇小文章。每篇小文章都是由小寫字母和空格組成,沒有標點符號,每

[C++]程式設計的基礎問題

例如有一個 min 函式,我們希望它相對型別是獨立的,也就是說任何類/型別都可以呼叫這個函式。如果是一個整型的數,通常我們可以這樣寫: int min(const int & a,const int &b) { return a<b?a:b; } 為了讓它適用於多個類,我們知

[轉]C#程式設計

 泛型:通過引數化型別來實現在同一份程式碼上操作多種資料型別。利用“引數化型別”將型別抽象化,從而實現靈活的複用。 例子程式碼: class Program     {         static void Main(string[] args)         {    

Java基礎:Java程式設計快速入門

1、Java泛型 其實Java的泛型就是建立一個用型別作為引數的類。就象我們寫類的方法一樣,方法是這樣的method(String str1,String str2 ),方法中引數str1、str2的值是可變的。而泛型也是一樣的,這樣寫class Java_Generics<

程式設計:源起、實現與意義

3.介面直觀性:如果你有一個數組char* arr = new arr[10];那麼該陣列的元素型別其實就已經“透露”了它自己的大小。然而qsort把陣列的元素型別給“void”掉了(void *base),於是丟失掉了這一資訊,而只能讓呼叫方手動提供一個size。為什麼要把陣列型別宣告為void*?因為除此