溫習(xí) 6+2 種排序方式

  • 堆排序(實(shí)現(xiàn)難易:???)

① 將序列生成堆悠垛,調(diào)整成最大堆
② 彈出堆頂油航,生成新序列啥箭,重復(fù) ① 。


  • 快速排序(實(shí)現(xiàn)難易:???)

(a)先移動 j 找到 <= low 的數(shù)爹梁,再移動 i 找到>= low 的數(shù):
① 若 i < j 右犹,兩者交換,繼續(xù)移動姚垃。 ② 若 i >= j念链,j 與 low 交換。
(b)交換后數(shù)列劃分积糯,分別令各子數(shù)列第一個(gè)數(shù)為 low掂墓,重復(fù)(a)。


  • 歸并排序(實(shí)現(xiàn)難易:???)
  • 希爾排序(實(shí)現(xiàn)難易:??)
  • 直接插入排序(實(shí)現(xiàn)難易:?)

將下標(biāo) 1~n-1 的數(shù)依次插入準(zhǔn)序數(shù)列絮宁。


  • 簡單選擇排序(實(shí)現(xiàn)難易:?)

將下標(biāo) j=i+1~n-1 的最小數(shù)依次放在 i=0~n-2梆暮。


  • 冒泡排序(實(shí)現(xiàn)難易:?)

將下標(biāo) i=n-1~1 的數(shù)從后往前兩兩相鄰數(shù) j=i-1~0 比較,若反序則交換绍昂。

  • 哈希排序(實(shí)現(xiàn)難易:?)

運(yùn)用一個(gè)數(shù)組來記錄每個(gè)數(shù)出次數(shù)啦粹,也就是將序列和數(shù)組的下標(biāo)進(jìn)行對應(yīng)偿荷,從而實(shí)現(xiàn)排序。

#include <iostream>
#include <stdlib.h>
using namespace std;

//1唠椭、直接插入排序
void InsertSort(int key[], int n){
    int i,j;                                
    for(i=1; i<n; i++){             //遍歷第 2~n-1 個(gè)元素
        int insert = key[i]; 
        for(j=i-1; j>=0; j--){
            if(insert < key[j])
                key[j+1] = key[j];
            else break;
        }
        key[j+1] = insert;          
    }
}

//2跳纳、簡單選擇排序
void SelectSort(int key[], int n){
    int small,i,j;
    for(i=0; i<n-1; i++){           //遍歷第 1~n-1 個(gè)元素 
        small = i; 
        for(j=i+1; j<n; j++){       //遍歷第 i+1~n 個(gè)元素
            if(key[j] < key[small]) 
                small = j;
        }
        if(small != i)                         
            swap(key[i], key[small]);  
    }
}

//3迈螟、冒泡排序
void BubbleSort(int key[], int n){
    int i,j;                    
    for(i=n-1; i>0; i--){           //遍歷第 2~n 個(gè)元素
        bool isSwap = false;   
        for(j=0; j<i; j++){         //遍歷第 1~i 個(gè)元素
            if(key[j] > key[j+1]){
                swap(key[j],key[j+1]);
                isSwap = true;
            }
        }
        if(!isSwap) break;     
    }
}

//4河咽、快速排序 
int Partition(int key[], int low,int high){
    int i = low,j = high + 1;
    int flag = key[low];            //當(dāng)前分割元素
    do{
        do i++;
        while(key[i] < flag);      
        do j--;
        while(key[j] > flag);     
        if(i < j)
            swap(key[i], key[j]);    
    }while(i < j);
    swap(key[low], key[j]);
    return j;                       //下一個(gè)分割元素 
}

void QuickSort(int key[], int low, int high){   
    int k;
    if(low < high){                            
        k = Partition(key,low,high);
        QuickSort(key,low,k-1);
        QuickSort(key,k+1,high);
    }
}

void QuickSort(int key[], int n){                 
    QuickSort(key,0,n-1);
}

//5、歸并排序
void _merge(int key[], int low, int mid, int high) { //合并
    for (int i = 0; i < mid; i++) { 
        for (int j = mid; j < high; j++) {
            if (key[i] > key[j]) 
                swap(key[i], key[j]);
        }
    }
}

void MergeSort(int key[], int low, int high) {
    if (low < high) {
        int length = high - low;
        if (length == 1) {
            if (key[low] > key[high])
                swap(key[low],key[high]);
        }
        for (int i=length/2; i>0; i=i/2) {  //分治 
            MergeSort(key, low, low + i);
            MergeSort(key, high - i, high);
            _merge(key, low, i, high);      //i為有序序列長度 
        }
    }
}

//6压汪、堆排序
void AdjustDown(int heap[], int current, int border){
    int tmp = heap[current];
    while (2*current+1<=border){
        int child = 2*current+1;            //左孩子 
        if (child+1<=border && heap[child]<heap[child+1])
            child++;
        if (heap[child] > heap[current]) {
            heap[current] = heap[child];
            heap[child] = tmp;
        }
        else break;
        current=child;
    }
}

void HeapSort(int heap[],int n){
    for(int i=(n-2)/2; i>=0; i--)           //初始調(diào)整 
        AdjustDown(heap,i,n-1);
    for(int j=n-1; j>0; j--){
        swap(heap[0],heap[j]);              //交換 
        AdjustDown(heap, 0, j-1);           //調(diào)整 
    }
}


//7力崇、希爾排序 
void shell(int arr[], int n, int start, int gap) {
    for (int j = start + gap; j < n; j += gap) {
        int i = j - gap;
        int tmp = arr[j];
        while (i >= start && arr[i] > tmp) {
            arr[i + gap] = arr[i];
            i -= gap;
        }
        arr[i + gap] = tmp;
    }
}
void ShellSort(int arr[], int n) {
    if (n <= 1) 
        return;
    for (int gap=n/2; gap>=1; gap/=2) {
        for (int i=0; i<gap; i++) 
            shell(arr, n, i, gap);
    }
}

//8斗塘、哈希排序 
void HashSort(int key[], int n){
    int hash_map[n] = {0};   
    for (int i = 0; i < n; i++){
        hash_map[key[i]]++;
    }   
    for (int i = 0; i < n; i++){  
        for (int j = 0; j < hash_map[i]; j++)
            printf("%d ", i);
    } 
}

//產(chǎn)生隨機(jī)序列 
void Init(int key[], int n){
    cout<<"\n\n隨機(jī)序列:";
    for(int i=0; i<n; i++){
        key[i] = rand()%20;
        cout<<key[i]<<" ";
    }
} 

//輸出有序序列 
void output(int key[], int n){
    for(int i=0; i<n; i++)
        cout<<key[i]<<" ";
}

int main(){
    int key[500000], n; 
    cout<<"\n隨機(jī)序列長度:";              cin>>n;     
    Init(key,n);                            InsertSort(key,n); 
    cout<<"\n\n直接插入排序:";                output(key,n);     
    Init(key,n);                            SelectSort(key,n); 
    cout<<"\n\n簡單選擇排序:";                output(key,n);
    Init(key,n);                            BubbleSort(key,n); 
    cout<<"\n\n冒泡排序:";                  output(key,n); 
    Init(key,n);                            QuickSort(key,n); 
    cout<<"\n\n快速排序:";                  output(key,n);    
    Init(key,n);                            MergeSort(key,0,n-1);
    cout<<"\n\n歸并排序:";                  output(key,n);     
    Init(key,n);                            HeapSort(key,n); 
    cout<<"\n\n堆排序:";                   output(key,n);   
    Init(key,n);                            ShellSort(key,n); 
    cout<<"\n\n希爾排序:";                  output(key,n);
    Init(key,n);                            
    cout<<"\n\n哈希排序:";                  HashSort(key,n); 
    cout<<"\n\n";
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市亮靴,隨后出現(xiàn)的幾起案子馍盟,更是在濱河造成了極大的恐慌,老刑警劉巖茧吊,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贞岭,死亡現(xiàn)場離奇詭異,居然都是意外死亡搓侄,警方通過查閱死者的電腦和手機(jī)瞄桨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讶踪,“玉大人芯侥,你說我怎么就攤上這事∪榧ィ” “怎么了筹麸?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長雏婶。 經(jīng)常有香客問我物赶,道長,這世上最難降的妖魔是什么留晚? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任酵紫,我火速辦了婚禮,結(jié)果婚禮上错维,老公的妹妹穿的比我還像新娘奖地。我一直安慰自己,他們只是感情好赋焕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布参歹。 她就那樣靜靜地躺著,像睡著了一般隆判。 火紅的嫁衣襯著肌膚如雪犬庇。 梳的紋絲不亂的頭發(fā)上僧界,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機(jī)與錄音臭挽,去河邊找鬼捂襟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛欢峰,可吹牛的內(nèi)容都是我干的葬荷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼纽帖,長吁一口氣:“原來是場噩夢啊……” “哼宠漩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起懊直,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤哄孤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后吹截,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凝危,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年波俄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛾默。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡懦铺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出支鸡,到底是詐尸還是另有隱情冬念,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布牧挣,位于F島的核電站急前,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瀑构。R本人自食惡果不足惜裆针,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寺晌。 院中可真熱鬧世吨,春花似錦、人聲如沸呻征。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陆赋。三九已至沐祷,卻和暖如春嚷闭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背戈轿。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工凌受, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人思杯。 一個(gè)月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓胜蛉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親色乾。 傳聞我的和親對象是個(gè)殘疾皇子誊册,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容