各類排序算法實現(親測)

排序算法通常分為外部排序和內部排序,通常所說的八類排序屬于內部排序;
這里寫圖片描述
外部排序在此不說明,主要給出八類排序的簡單思想和實現:
1.插入排序
1.1 直接插入排序:
每次將一個新數,插入到已經排列好的有序序列當中,新數作為key值和有序序列中的數值比較。
代碼實現

#include <stdio.h>
void main(){int i,j,key;int A[7]={12,41,23,17,5,2,38};for(j=1;j<7;j++){key=A[j];for(i=j-1;i>=0;i--){if(A[i]>key){A[i+1]=A[i];}else{break;}}A[i+1]=key;}for(i=0;i<7;i++){printf("%d-",A[i]);}
}
1.2希爾排序

希爾排序是1959 年由D.L.Shell 提出來的,相對直接排序有較大的改進。希爾排序又叫縮小增量排序;思想是將待排序的序列分成若干子序列,對每個子序列進行直接插入排序,當序列基本有序時,最后再進行一次直接插入排序;增量d取值:d = {n/2 ,n/4, n/8 …..1}
代碼實現:

#include <stdio.h>
#include <iostream>
using namespace std;
void shellInsert(int a[],int n,int dk){for(int i=dk;i<n;i++){if(a[i]<a[i-dk]){int key = a[i];//cout<<key;int j=i-dk;//a[i]=a[j];while(key<a[j] && j >=0 ){a[j+dk]=a[j];j-=dk;}a[j+dk]=key;}}
}
void shellSort(int a[],int n){int dk = n/2;
//      cout << dk;while (dk >= 1){cout <<"dk:"<<dk<<"\n";shellInsert(a,n,dk);dk=dk/2;}for (int i=0;i<n;i++){cout << a[i]<<",";}
}int main(){int a[13]={12,45,67,8,90,34,25,67,9,10,14,78,29};shellSort(a,13);return 0;
}

2 選擇排序
2.1 簡單選擇排序
在要排序的一組數中,選出最小(或者最大)的一個數與第1個位置的數交換;然后在剩下的數當中再找最小(或者最大)的
與第2個位置的數交換,依次類推,直到第n-1個元素(倒數第二個數)和第n個元素(最后一個數)比較為止。
代碼實現:

#include <iostream>
using namespace std;
int selectMiniKey(int a[],int n,int b){int min=b;for (int j=b+1;j<n;++j){if(a[j]<a[min]){min=j;}}return min;
}
void selectSort(int a[],int n){int min,temp;for(int i=0;i<n;++i){min=selectMiniKey(a,n,i);if(i!=min){temp=a[i];a[i]=a[min];a[min]=temp;}}
}
int main(){int a[13]={12,45,67,8,90,34,25,67,9,10,14,78,29};selectSort(a,13);for(int i=0;i<13;++i){cout << a[i]<<",";}return 1;
}
簡單選擇排序的改進--二元選擇排序
每次同時挑選出最小的和最大的:
代碼實現:
#include <iostream>
using namespace std;void selectSort2(int a[],int n){int min,max,temp;for(int i=1;i<=n/2;i++){min=i-1,max=i-1;for (int j=i;j<=n-i;j++){if(a[j]>=a[max]){max=j;continue;}if(a[j]<=a[min]){min=j;}}cout<<a[min]<<":"<<a[max]<<"\n";/***watch out the swap order,it matters if i-1==max,then the min swap will have effect on max swap*/if((i-1)!=max){temp=a[i-1];a[i-1]=a[min];a[min]=temp;temp=a[n-i];a[n-i]=a[max];a[max]=temp;}else{temp=a[n-i];a[n-i]=a[max];a[max]=temp;temp=a[i-1];a[i-1]=a[min];a[min]=temp;}//temp=a[n-i];a[n-i]=a[max];a[max]=temp;cout<<i<<":";for(int z=0;z<n;++z)cout<<a[z]<<",";cout << "\n";}}
int main(){int a[13]={12,45,67,8,90,34,25,67,9,10,14,78,29};selectSort2(a,13);for(int i=0;i<13;++i){cout << a[i]<<",";}return 1;
}
2.2 堆排序
首先將待排序的序列構建成一個大頂堆或者小頂堆;之后將堆頂元素與最后一個元素交換,選擇出最大或者最小的元素;之后將前面n-1個元素重新調整為一個大頂堆或者小頂堆,重復上面的過程,直到選擇出最后一個元素;堆排序的過程其實就分為兩步:一是構建堆;二是調整堆,事實上構建堆的過程也是通過調整堆來實現的。
代碼實現:(遞歸實現)
#include<iostream>
using namespace std;
void printHeap(int a[],int n){for(int i=0;i<n;++i)cout<<a[i]<<",";cout<<"\n";
}
void heapAdjust(int a[],int s,int e){int tmp=a[s];int child=2*s+1;if(child>=e) return;if(child+1<e && a[child]<a[child+1]){++child;}if(a[s]<a[child]){a[s]=a[child];a[child]=tmp;heapAdjust(a,child,e);}
}
void heapBuild(int a[],int n){for(int i=(n-1)/2;i>=0;--i){heapAdjust(a,i,n);}
}
void heapSort(int a[],int n){heapBuild(a,n);printHeap(a,n);for(int i=n-1;i>=0;--i){int tmp=a[0];a[0]=a[i];a[i]=tmp;heapAdjust(a,0,i);}
}
int main(){int a[13]={12,45,67,8,90,34,25,67,9,10,14,78,29};heapSort(a,13);printHeap(a,13);return 1;
}

3 交換排序
3.1 冒泡排序
在要排序的一組數中,對當前還未排好序的范圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較后發現它們的排序與排序要求相反時,就將它們互換。
代碼實現:

#include<iostream>
using namespace std;
void printArray(int a[],int n){for(int i=0;i<n;++i)cout<<a[i]<<",";cout<<"\n";
}
void bubleSort(int a[],int n){for (int i=0;i<n;++i){for(int j=0;j<n-i;++j){if(a[j]>a[j+1]){int tmp=a[j];a[j]=a[j+1];a[j+1]=tmp;}}}printArray(a,n);
}
int main(){int a[13]={12,45,67,8,90,34,25,67,9,10,14,78,29};bubleSort(a,13);return 1;
}
3.2快速排序
思想:選擇一個基準元素,通常選擇第一個元素或者最后一個元素,通過一趟排序講待排序的記錄分割成獨立的兩部分,其中一部分記錄的元素值均比基準元素值小,另一部分記錄的元素值比基準值大,此時基準元素在其排好序后的正確位置;然后分別對這兩部分記錄用同樣的方法繼續進行排序,直到整個序列有序。
代碼實現:
#include<iostream>
using namespace std;void printArray(int a[],int n){for (int i=0;i<n;++i)cout<<a[i]<<",";cout << "\n";
}
void swap(int *a,int *b){int tmp=*a;*a=*b;*b=tmp;
}
int partitionKey(int a[],int low,int high){int key=a[low];while(low<high){/**whatch the if condition is >= and --high not high--*/while(low<high && a[high]>=key)--high;swap(&a[low],&a[high]);while(low<high && a[low]<=key) ++low;swap(&a[low],&a[high]);}return low;
}
void quickSort(int a[],int low,int high){if(low<high){int key=partitionKey(a,low,high);/**watch that edge number dose not contain key itself*/quickSort(a,low,key-1);quickSort(a,key+1,high);}
}
int main(){int a[13]={12,45,67,8,90,34,25,67,9,10,14,78,29};quickSort(a,0,12);printArray(a,13);return 1;
}

4 歸并排序
思想:將兩個有序表歸并成一個有序表;注意是兩個有序表;對于一個待排序列來說,可以將代排序列分成若干個子序列,調整子序列有序后,再將子序列歸并成一個更大的有序列,直到序列全部有序。
代碼實現

#include<iostream>
using namespace std;void printArray(int a[],int n){for(int i=0;i<n;++i)cout<<a[i]<<",";cout<<"\n";
}
void merge(int a[],int b[],int first,int mid,int last){int k=0,i=first,j=mid+1,n=last,m=mid;while(i<=m && j<=n){if(a[i]<a[j]){b[k++]=a[i++];}else{b[k++]=a[j++];}}while(i<=m) b[k++]=a[i++];while(j<=n) b[k++]=a[j++];for(int s=0;s<k;s++){a[s+first]=b[s];}}
void mergeSort(int a[],int b[],int s,int e){int mid;if(s==e) return;mid=(s+e)/2;mergeSort(a,b,s,mid);
}
void mergeSortRecursive(int a[],int n){int *p = new int[n];if(p==NULL) return;mergeSort(a,p,0,n-1);printArray(a,n);
}int main(){int a[13]={12,45,67,8,90,34,25,67,9,10,14,78,29};mergeSortRecursive(a,13);return 1;
}

5 基數排序
比較簡單,就不實現了,感興趣的可以看一下http://blog.csdn.net/hguisu/article/details/7776068這篇博客,講的比較細.

轉載于:https://www.cnblogs.com/wesia/p/5747372.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271508.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271508.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271508.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

沖正什么意思

沖正是用戶在進行銀行轉賬或者du取現交易時&#xff0c;在未操作成功&#xff0c;但是銀行卡賬戶發生了扣款時&#xff0c;采取的一種補救的方法&#xff0c;銀行的專業術語稱之為沖正。其實就是銀行系統在誤扣了用戶銀行卡中的金額后&#xff0c;再將金額退還到用戶銀行卡中的…

.net 2005大寫html標簽 xhtml10,HTML10.ppt

關于標簽的說明 正如之前所說的&#xff0c;部分的內容并不是為瀏覽者寫的&#xff0c;而是為瀏覽器和搜索引擎寫的。因此部分不應該含有任何在頁面中可視的的內容。 DTD 如果現在再次效驗我們的網頁&#xff0c;仍然會得到出錯信息&#xff0c;提示找不到DTD文件&#xff0c;那…

計算機基礎:聲音的相關知識筆記

1、聲音的相關概念 模擬聲音信號&#xff1a;聲波在時間和幅度上都是連續的模擬信號。 1.1 聲音的組成 幅度&#xff1a;聲波的振幅。計量單位是分貝&#xff08;dB&#xff09; 頻率&#xff1a;聲波每秒變化的次數&#xff0c;用Hz表示。人耳能聽到的聲音信號的頻率范圍20Hz~…

ansi編碼_Java 字符編碼

點擊上方藍字關注我們&#xff01;作者介紹王云靜&#xff0c;Java 開發工程師&#xff0c;2018 年 7 月加入去哪兒網&#xff0c;目前在目的地 - 呼叫中心。曾獲得過 ACM 亞洲區域賽銅牌。-----基本概念字符集字符(Character)是各種文字和符號的總稱&#xff0c;包括各國家文字…

外賣和快遞行業數據_下周一起,整治全面啟動!鎖定全市外賣、快遞行業!

為加強我市外賣、快遞行業電動自行車交通安全管理&#xff0c;降壓預防事故&#xff0c;營造良好的通行秩序&#xff0c;下周一起(12月21日)深圳交警將開展電動自行車交通安全月暨外賣、快遞行業集中整治行動。?圈重點?下周一起(12月21日)正式開展外賣、快遞行業集中整治行動…

計算機基礎:圖形、圖像相關知識筆記

1、圖形、圖像的基礎知識 圖形&#xff1a;由稱為矢量的數學對象所定義的直線和曲線等組成。 圖像&#xff1a;也稱為柵格圖像&#xff0c;由點陣圖或位圖圖像、用像素來代表圖像。每一個像素都被分配一個特點的位置和顏色值。 圖形和圖像之間在一定條件下可以互相轉換&#xf…

計算機應用用什么樣的筆記本,制圖用什么筆記本好

以前人們常說的繪畫都是在紙上&#xff0c;然而科技時代的到來也讓繪畫的方式有了改變&#xff0c;而且現實中還在發展電子商務&#xff0c;因此大家都開始使用計算機制圖&#xff0c;不同的計算機制圖的方式不一樣&#xff0c;專業使用電腦制圖的人都會對電腦比較挑剔。它們還…

Powerdesigner 在線打開 不用安裝客戶端 訪問pdm,ldm文件

Powerdesigner 在線打開 不用安裝客戶端 http://www.dmanywhere.cn/

【代碼筆記】iOS-下拉選項cell

一&#xff0c;效果圖。 二&#xff0c;工程圖。 三&#xff0c;代碼。 RootViewController.h #import <UIKit/UIKit.h> //加入頭文件 #import "ComboBoxView.h"interface RootViewController : UIViewController {ComboBoxView *_comboBox; }end RootV…

寬量程電壓電流 stm32_萬用表你只會量電壓電流?史上最全萬用表手冊,這么做你不會燒表...

一&#xff0c;萬用表使用前的準備。二&#xff0c;萬用表各個檔位的含義。三&#xff0c;萬用表測量電壓。四&#xff0c;萬用表測量電流。五&#xff0c;萬用表測量電阻。六&#xff0c;萬用表測量二極管。七&#xff0c;萬用表測量電容。八&#xff0c;萬用表一般的維護保養…

24個筆畫順序表_小學一年級語文26個漢語拼音字母要點+田字格兒歌,趕緊給孩子看...

126個漢語拼音字母要點漢語拼音字母表-聲母表漢語中每個音節起始處的輔音可以構成聲母。漢語拼音方案《聲母表》規定的聲母符號一共有23個。b [玻] p [坡] m [摸] f [佛]d [得] t [特] n [訥] l [勒]g [哥] k [科] h [喝] j [基] q [欺] x [希]z [資] c[雌] s [思] r [日] zh[知…

多媒體基礎:動畫和視頻知識筆記

1、動畫和視頻的概念 動畫&#xff1a;將靜態的圖像、圖形等按照一定的時間順序顯示而形成的連續的動態畫面。傳統意義來說動畫是在連續多格的膠片上拍攝的一系列畫面&#xff0c;比將膠片以一定的速度放映&#xff0c;從而產生動態的視覺技術。 視頻&#xff1a;活動的、連續的…

mongoDB的安裝(一)

0、安裝環境說明&#xff1a; linux系統&#xff1a;centos6.5 mongoDB版本&#xff1a;mongodb-linux-x86_64-rhel62-3.2.7.tgz 1、下載 mongoDB的下載&#xff1a;https://www.mongodb.com/download-center#community&#xff0c;注意選擇版本 2、解壓 tar -zxvf mongodb-lin…

計算機管理任務計劃程序損壞,win7彈出任務計劃程序窗口顯示該任務映像損壞或已篡改0x80041321錯誤代碼怎么辦...

最近有win7 64位專業版系統用戶到本站反饋說碰到這樣一個問題&#xff0c;就是電腦突然彈出一個任務計劃程序窗口&#xff0c;顯示該任務映像損壞或已篡改0x80041321錯誤代碼&#xff0c;遇到這樣的問題該如何處理呢&#xff0c;本文就給大家講解一下win7彈出任務計劃程序窗口顯…

c51單片機矩陣鍵盤1602計算器_基于51單片機矩陣鍵盤的簡易計算器制作

1. 運算過程、符號公式實時顯示在顯示屏上(I2C 1602)。2. 自帶三角函數、開根號、平方運算。3. 計算得出的結果可設置保存并用以下一次計算。4. 所有運算結果精確到至少小數點后兩位。5. 運算結果可通過串口發送給上位機。6. 當斷電重啟時&#xff0c;能存儲并顯示斷電前正在計…

Visual paradigm社區版下載及中文菜單的設置

免費的官網社區版鏈接為&#xff1a; https://www.visual-paradigm.com/download/community.jsp 設置中文菜單 安裝之后&#xff0c;由于如果想設置中文菜單的話&#xff0c;可能會遇到麻煩&#xff0c;因為菜單太多 如下圖&#xff0c;所示步驟&#xff1a; Window-->…

python畫函數圖像要用到的模塊_教你如何繪制數學函數圖像——numpy和matplotlib的簡單應用...

numpy和matplotlib的簡單應用 一、numpy庫 1.什么是numpy NumPy系統是Python的一種開源的數值計算擴展。這種工具可用來存儲和處理大型矩陣&#xff0c;比Python自身的嵌套列表&#xff08;nested list structure)結構要高效的多&#xff08;該結構也可以用來表示矩陣&#xff…

臺式電腦如何使用無線網,wifi怎么連接?

隨著網絡的發展&#xff0c;現在無線路由器已經深入到尋常百姓家了&#xff0c;無線信號滿街都是&#xff0c;但是作為臺式電腦&#xff0c;卻不具備wifi自動連接這個功能。那么&#xff0c;臺式電腦怎么用wifi呢&#xff1f;下面小編就教大家wifi如何連接。1、電腦必須安裝一塊…

軟件測試的缺陷管理系統有哪些,簡述:一款優秀的缺陷管理系統有哪些功能特點!...

原標題&#xff1a;簡述&#xff1a;一款優秀的缺陷管理系統有哪些功能特點&#xff01;什么是缺陷管理系統&#xff1f;缺陷管理系統指的是在軟件生命周期中識別、管理、溝通任何缺陷的過程(從缺陷的識別&#xff0c;到缺陷的解決關閉)&#xff0c;確保缺陷被跟蹤管理而不丟失…

haproxy服務啟動命令_安裝haproxy和haproxy命令

1.安裝haproxyCentOS自帶了haproxy&#xff0c;但可能版本比較老。可以在IUS源上找到最新穩定版的haproxy。cat </etc/yum.repos.d/ius.repo[ius]nameiusrepobaseurlhttps://mirrors.tuna.tsinghua.edu.cn/ius/stable/CentOS/$releasever/\$basearchgpgcheck0enable1eofyum …