排序是日常生活和數學中的重要任務。大多數時候,您必須按升序或降序對對象或數字進行排序,甚至按奇數序列進行排序。這完全取決於你想如何排列你的數字或對象。的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()的一些要點。
- 在c++ STL中,我們有一個排序函數,它可以按遞增和遞減順序進行排序。
- 不僅可以整型,還可以使用此函數對用戶定義的數據進行排序。
- 它內部使用IntroSort,它是快速排序、堆排序和插入排序的組合。
(這一點很重要,因為它發生在內部,沒有人知道。)
- 默認情況下,它使用快速排序,但如果快速排序正在進行不公平的分區,並且占用超過N*logN的時間,它將切換到堆排序。當數組的大小變得非常小時,它切換到InsertionSort。
(這種轉換和檢查發生在內部,不太受人們歡迎)
- 我們可以使用並行執行策略來獲得更好的性能。
(要調用這個策略,你隻需要傳遞一個參數std::類(執行std:::: par, Vec.begin (), Vec.end ());
你必須提到開頭和結尾,剩下的就交給它了。您不需要進行任何多線程編碼就可以獲得良好的結果。
請注意:在一些情況下,當您擁有數據數組時,不能使用並行執行策略。在STL的算法部分有很多其他的算法。你也可以做並行處理。)
如果您想要更快的結果或有大量的數據,您可以使用並行處理進行排序。
無論何時使用Sort(),在該函數下不僅有一個排序函數,如快速排序或其他排序函數。有不同的排序算法。根據您輸入的數據類型和環境,它選擇正確的排序算法並對數據進行排序。
排序函數的類型
有四種不同的方法或類型可以使用Sort()。
- 對整體數據類型進行排序
- 對用戶定義數據類型進行排序
- 使用函數對象進行排序
- 使用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.插入排序
插入排序是一種簡單的就地比較排序算法。
它維護一個總是排序的子數組(子列表),每次構建一個元素。它選擇每個元素並將其插入到已排序子數組中已排序的位置。
例子:
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++麵試問題像專業人士一樣打滿分。