瀏覽通過域

c++中的排序函數|

排序是日常生活和數學中的重要任務。大多數時候,您必須按升序或降序對對象或數字進行排序,甚至按奇數序列進行排序。這完全取決於你想如何排列你的數字或對象。的c++中的排序函數通過提供Sort()函數在STL中,標準模板庫。STL是一個由預定義的函數和數據結構組成的庫,它具有良好的用戶友好性。STL還包括容器類、算法和迭代器。

了解更多關於的基礎知識c++中的排序函數在這裏:

c++中的排序函數是什麼?

Sort是c++ STL(標準模板庫)中的一個內建函數。此函數用於按升序或降序對範圍內的元素進行排序。

函數的語法:

默認(1)template  void sort (RandomAccessIterator第一,RandomAccessIterator最後);自定義(2)template  void sort (RandomAccessIterator第一,RandomAccessIterator最後,Compare comp);

排序算法

在我們進一步了解STL中的Sort()之前,我們需要了解Sort()的一些要點。

  1. 在c++ STL中,我們有一個排序函數,它可以按遞增和遞減順序進行排序。
  1. 不僅可以整型,還可以使用此函數對用戶定義的數據進行排序。
  1. 它內部使用IntroSort,它是快速排序、堆排序和插入排序的組合。

(這一點很重要,因為它發生在內部,沒有人知道。)

  1. 默認情況下,它使用快速排序,但如果快速排序正在進行不公平的分區,並且占用超過N*logN的時間,它將切換到堆排序。當數組的大小變得非常小時,它切換到InsertionSort。

(這種轉換和檢查發生在內部,不太受人們歡迎)

  1. 我們可以使用並行執行策略來獲得更好的性能。

(要調用這個策略,你隻需要傳遞一個參數std::類(執行std:::: par, Vec.begin (), Vec.end ());

你必須提到開頭和結尾,剩下的就交給它了。您不需要進行任何多線程編碼就可以獲得良好的結果。

請注意:在一些情況下,當您擁有數據數組時,不能使用並行執行策略。在STL的算法部分有很多其他的算法。你也可以做並行處理。)

如果您想要更快的結果或有大量的數據,您可以使用並行處理進行排序。

無論何時使用Sort(),在該函數下不僅有一個排序函數,如快速排序或其他排序函數。有不同的排序算法。根據您輸入的數據類型和環境,它選擇正確的排序算法並對數據進行排序。

排序函數的類型

有四種不同的方法或類型可以使用Sort()。

  1. 對整體數據類型進行排序
  2. 對用戶定義數據類型進行排序
  3. 使用函數對象進行排序
  4. 使用lambda表達式進行排序

對整體數據類型進行排序

在這種類型中,您將使用整數數據類型,例如1、2等,或者換句話說,使用整數。

示例程序:

#include  #include  #include  #include <執行>int main () {std::向量< int > Vec{5、3、6,2、7、4、1、8、2、9};std::類(執行std:::: par, Vec.begin (), Vec.end ());for(auto elm:Vec) {cout << elm << " ";}返回0;}

輸出:

1 2 3 4 5 6 7 8 9對用戶定義數據類型進行排序

這種類型非常重要,在這種類型中,根據類的參數有一個對象集合。

如果你想對數組或向量中的所有對象排序,

示例程序:

類點{public: int x;int y;點(int x=0, int y=0): x(x), y(y) {} bool操作符< (const Point& p1){return (x +y) < (p1.)x + p1.y);}};< int main () {std::向量點> Vec {{1,2}, {3 1}, {0,1}};std::類(Vec.begin (), Vec.end ());(Vec)汽車e: {Cout < < e.x < < " " < < e.y < < endl;}返回0;}

解釋:

類點是用戶定義的數據類型。我們以操作符重載的形式使用了“小於”操作符(“<”)。排序將一個元素與另一個元素進行比較,它接受一個元素並使用' less '操作符進行比較,然後接受下一個元素。考慮“A”是類Point的對象,而B也是同一類的對象。由於A

考慮' 1 '和' 2 '是一個對象,' 3 '和' 1 '是一個對象。現在,' 1 '和' 2 '相加是' 3 '。此外,' 3 '和' 1 '相加是' 4 '。在比較時,' 3 '小於' 4 ',所以' 1 '和' 2 '對象將被放在前麵,這個過程將繼續下去,直到它們被排序。

輸出:

0 1

1 2

3 1

注意:如果希望按降序對對象或集合排序,則必須重載大於操作符,並將std::greater()作為排序函數的第三個參數。

例子:

Sort (Vec.begin (), Vec.end (), std::更大的< >點());

使用函數對象進行排序

該方法使用函數對象進行排序。

例子:

結構{bool操作符()(int a, int b) const{返回a Vec{5、4、6、7、3、2、8、1}std::類(Vec.begin (), Vec.end () .customLess);for(auto elm: Vec){cout<< elm<< " ";}

解釋:

' customLess '是我們在這個例子中使用的指針。它在圓括號內作為函數調用,當它被調用時,它被重定向到結構塊,排序函數開始。

輸出:

1 2 3 4 5 6 7 8

使用Lambda表達式進行排序

在這種類型中,您將直接將函數注入到調用對象的位置。您可以直接使用函數體,而不是創建一個單獨的函數塊來執行表達式並在主函數中調用它。我們可以直接將它們添加到主函數本身。

示例程序:

int main () {std::向量< int > Vec{5、4、7、6、2、8、9、1,3};std::sort (Vec.begin(), Vec.end(), [](int a, int b){返回a
           

輸出:

1 2 3 4 5 6 7 8 9

除了使用Sort()函數之外,很少有其他排序方法是通過編寫代碼手動完成的。這些方法主要用於數組集。

這些方法有:

  1. 冒泡排序
  2. 插入排序
  3. 選擇排序
  4. 歸並排序
  5. 快速排序
  6. 堆排序

讓我們來看一些排序方法。

1.插入排序

插入排序是一種簡單的就地比較排序算法。

它維護一個總是排序的子數組(子列表),每次構建一個元素。它選擇每個元素並將其插入到已排序子數組中已排序的位置。

例子:

void insertionSort(int A[],int n) {int i,值,索引;for(i=1;i0 && A[index-1] {A[index]=A[index-1];指數=索引1;}(指數)=價值;}}

解釋:

考慮一個名為A的數組,它包含六個元素

5 2 3. 1 6 4

我們知道索引號總是從0開始。

我們從第一個元素開始。最初,排序的子數組有0個元素。當我們插入第一個元素時,它將被放在已排序的位置。它一個一個地選擇每個元素。變量" i '對於數組內的橫向很有用。此外,我們使用變量“value”和“index”。Value用於存儲所選元素的值,index用於將該元素插入已排序的子數組中。變量“index”包含所選元素的索引。將數組A中的每個元素與已排序子數組中的元素進行比較。在每次比較之後,它將所有大於所選元素的元素移到右邊的一個位置。然後將選定的元素插入其排序位置。 This process repeats till the array is sorted.

2.冒泡排序

冒泡排序是一種簡單的基於比較的算法,其中每對相鄰元素都要進行比較,如果它們不在正確的位置,則交換它們。

示例程序:

void Bubblesort (int A[[], int n) {int k, i, temp,標誌;(k = 1; k < n;k++){標誌=0;(我= 0;我< n - k;i++) {If (A[i]>A[i+1]) {temp=A[i];[我]=[我+ 1};(i + 1) = temp;標誌= 1;}} if(flag==0) break; } }

解釋:

N是數組中的元素個數,K表示過去的數字,其中K的範圍是1到N -1。元素從索引號0開始與相鄰元素進行比較,直到索引號“n-k”,即每一個索引進行“n-k”比較。在每次比較之後,如果左邊的元素大於右邊的元素,它們的位置就會交換,否則就會移動到下一對。每次經過之後,較大的元素將被加到其排序位置。重複這個過程,直到數組被排序。

3.選擇排序

選擇排序也是一種簡單的就地比較排序算法。

示例程序:

int selectionSort (int A[], int n) {int i, j, small, temp;(我= 0;< n - 1, + +){小=我;(j = i + 1;j < n;j++) {if (A[j] < A[small]) small=j;} temp =[我];[我]=[小];[小]= temp;}}

解釋:

我們將需要排序的元素數組分為兩個子數組:' Sorted '(左)和' Unsorted '(右)。在開始時,我們認為整個數組是“無序的”。然後對數組逐個元素進行排序。隨著排序的進行,已排序子數組的大小增加,未排序子數組的大小減小。選中未排序子數組的最左邊的元素,並將其與未排序子數組的最小元素交換。

為了更好地理解,讓我們看一個例子。

3. 2 5 1 4

假設這個數組是“未排序的”,我們使用變量“i”選擇“未排序的”子數組中最左邊的元素。我們必須找到未排序子數組中最小的元素,並與最左邊的元素交換。為了找到最小的元素,我們使用變量“small”。變量" small "存儲最小元素的索引。然後它就等同於“i”。

最初,“i”和“small”的索引為0。另一個變量“j”用於遍曆數組以查找最小的元素。在每次迭代中,都會對“small”處的值與“j”處的值進行比較。假設“j”處的值小於“small”處的值。在這種情況下,元素的索引存儲在“small”中。這個過程一直重複,直到到達數組的末尾。

我們交換“i”和“small”處的值。因此,“small”值被存儲,並成為排序子數組的一部分。我們一遍又一遍地重複這個過程,每次對“small”的值進行排序時,“I”的值每次都會增加“1”,以選擇最左邊的元素。

最後的輸出:

1 2 3. 4 5

至此,關於c++中的排序函數的文章就結束了。我們希望這能幫助您在c++的旅程中輕鬆地提高技能。要了解更多關於這些概念的知識,請查看網站上的課程beplay2018官网很好的學習學院

此外,如果你正在準備麵試,看看這些c++麵試問題像專業人士一樣打滿分。

《阿凡達》的照片
beplay2018官网很好的學習團隊
beplay2018官网偉大學習的博客涵蓋了技術的最新發展和創新,可以用來建立有回報的職業生涯。你會找到職業指南、技術教程和行業新聞,讓自己跟上快速變化的科技和商業世界。

留下你的評論

您的電郵地址將不會公布。

用夢想的工作免費的印度最值得信賴的教育平台上的證書課程

滾動到頂部
Baidu
map