常見排序的原理和C++實現(一)——STL庫中sort的使用方法

記得以前面試的時候面試官讓我手寫排序,結果我磨蹭半天寫了個選擇排序,保不齊還有語法錯誤。後來我學會了寫冒泡排序,但是後來刷題發現一言不合就超時,後來我學會了寫快排,但是後來發現每次都寫一遍好心累,直到我知道了sort,所以這次就功利主義地總結一下sort的用法。

一、管中窺豹:
先看一個最簡單的sort的例子:

#include<iostream>
#include<algorithm> //sort需要的頭文件
using namespace std;

int main()
{
    int data[10] = { 1, 5, 2, 3, 4, 12, 3, 4, 5, 7 };
    sort(data, data + 10);
    for (int i = 0; i < 10; ++i) cout << data[i]<<' ';
    getchar();
    return 0;
}

結果爲:1 2 3 3 4 4 5 5 7 12
從中我們可以發現:sort()函數的排序默認升序排序的。

二、sort詳解
事實上,sort用兩種使用方法:
①sort(迭代器開始,迭代器結束)
②sort(迭代器開始,迭代器結束,比較函數的指針)
針對第一種表示方法,得到是升序排序,數組,vector和string都可以使用sort進行排序,例如:

string data = "1789207638";
sort(data.begin(), data.end());

針對第二種表示方法,比較函數的的作用是:如果進行比較的兩個元素,第一個在第二個前面,則返回true,否則返回false。
比如這個例子:

#include<iostream>
#include<algorithm> //sort需要的頭文件
using namespace std;

bool compare(const char a, const char b)
{
    if (a >= b) return false; //Attention!!!
    else return true;
}

int main()
{
    //int data[10] = { 1, 5, 2, 3, 4, 12, 3, 4, 5, 7 };
    //sort(data, data + 10, compare);
    string data = "1789207638";
    sort(data.begin(), data.end(),compare);
    for (int i = 0; i < 10; ++i) cout << data[i]<<' ';
    getchar();
    return 0;
}

這裏需要特別注意一點:compare函數中,如果兩個元素相等,要返回false,返回true編譯器很有可能報錯。compare函數的形參可以使指針,也可以是引用,也可以直接傳值。

三、複雜排序
利用自定義compare,我們可以實現一些複雜的排序方式,比如:根據學生的成績排序,成績相等的情況下根據學生姓名排序等。
比如pat的這道題,用sort和compare相結合,可以大大壓縮代碼量:
http://blog.csdn.net/qq_22194315/article/details/54584201

四、sort與qsort
qsort是stdlib.h中的排序函數。
qsort的使用方法是:
qsort(待排序數組首地址,排序的元素,單個排序元素佔用空間的大小,比較函數的指針)
這個比較函數比較複雜,首先函數返回值必須是int,其次,形參類型必須寫成const void*,最後如果希望第一個元素排在第二個前,返回一個正值,如果希望第一個元素排在第二個元素後,返回一個負值,如果第一個元素和第二個元素相等,返回0. 至於這個返回值的值究竟多大,說實話我也不甚瞭解。
qsort可以用在數組上,用在字符串和vector上不方便。

#include<iostream>
#include<stdlib.h> //qsort需要的頭文件
using namespace std;

int compare(const void *a, const void *b)
{
    return (*(int *) b- *(int *)a);
}

int main()
{
    int data[10] = { 1, 5, 2, 3, 4, 12, 3, 4, 5, 7 };
    qsort(data, 10,sizeof(int),compare);
    for (int i = 0; i < 10; ++i) cout << data[i]<<' ';
    getchar();
    return 0;
}

總得來說,個人感覺在寫代碼時,還是sort更加方便。

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