iOS 常用排序算法~集合

//聯系人:石虎QQ: 1224614774昵稱:嗡嘛呢叭咪哄

//常用的排序算法

細節請看:http://blog.csdn.net/shihuboke/article/details/77430132

#include

usingnamespacestd;

typedefintElemType;

一、插入排序

/*

1、插入排序

(1)直接插入排序算法

算法思想:將等排序列劃分為有序與無序兩部分,然后再依次將無序部分插入到已經有序的部分,最后

就可以形成有序序列。

操作步驟如下:

1)查找出元素L(i)在表中的插入位置K;

2)將表中的第K個元素之前的元素依次后移一個位置;

3)將L(i)復制到L(K)。

時間復雜度為:O(n^2)

*/

voidInsertSort(ElemTypearr[],intlength)

{

inti, j;

ElemTypeguard;//哨兵

for(i =1; i < length; ++i)

{

if(arr[i] < arr[i-1])//在無序部分尋找一個元素,使之插入到有序部分后仍然有序

{

guard = arr[i];//復制到“哨兵”

//將第i個元素之前的元素依次后移一個位置

for(j = i -1; arr[j] > guard; j--)

{

arr[j +1] = arr[j];

}

arr[j +1] = guard;//復制到插入位置

}

}

}

二、折半插入排序

/*

2、折半插入排序

使用于排序表為順序存儲的線性表

在查找插入位置時,采用折半查找

算法思想是:

1)設置折半查找范圍;

2)折半查找

3)移動元素

4)插入元素

5)繼續操作1)、2)、3)、4)步,直到表成有序。

*/

voidBinaryInsertSort(ElemTypearr[],intlength)

{

inti, j, low, high, mid;

ElemTypetmp;

for( i =1; i < length; ++i )

{

tmp = arr[i];//復制到哨兵

//設置折半查找范圍

low =0;

high = i;

while(low <= high)//折半查找

{

mid = (low + high) /2;

if(arr[mid] > tmp)//在左半部分查找

{

high = mid -1;

}

else

{

low = mid +1;//在右半部分查找

}

}

//移動元素

for( j = i -1; j >= high +1; --j )

{

arr[j +1] = arr[j];

}

arr[j +1] = tmp;

}

}

三、希爾(Shell)排序

/*

3、希爾(Shell)排序

基本思想:

先將待排序的表分割成若干個形若L[i, i+d, i+2d, ..., i+kd]的“特殊”子表,分別進行直接插入排序,

當整個表已呈“基本有序”時,再對全體記錄進行一次直接插入排序。

算法過程:

1)先取一個小于n的步長d1,把表中全部記錄分成d1個組,所有距離為d1的倍數的記錄放在同一組中,在各

組中進行直接插入排序;

2)然后取第二個步長d2 < d1,重復步驟1

3)直到dk = 1,再進行最后一次直接插入排序

*/

voidShellSort(ElemTypearr[],intlength)

{

inti, j, dk = length /2;

ElemTypetmp;

while(dk >=1)//控制步長

{

for(i = dk; i < length; ++i)

{

if(arr[i] < arr[i - dk])

{

tmp = arr[i];//暫存

//后移

for(j = i - dk; j >=0&& tmp < arr[j]; j -= dk)

{

arr[j + dk] = arr[j];

}

arr[j + dk] = tmp;

}

}

dk /=2;

}

}

四、冒泡排序算法

/*

4、冒泡排序算法

基本思想:

假設待排序的表長為n,從后向前或從前向后兩兩比較相鄰元素的值,若為逆序,則交換之,直到序列比較完。

這樣一回就稱為一趟冒泡。這樣值較大的元素往下“沉”,而值較小的元素入上“浮”。

時間復雜度為O(n^2)

*/

voidBubbleSort(ElemTypearr[],intlength)

{

inti, j;

ElemTypetmp;

for(i =0; i < length -1; ++i)//趟次

{

for(j = i +1; j < length; ++j)

{

if(arr[i] > arr[j])

{

tmp = arr[i];

arr[i] = arr[j];

arr[j] = tmp;

}

}

}

}

五、快速排序算法

/*

5、快速排序算法

基本思想:基于分治法,在待排序的n個元素中任取一個元素pivot作為基準,通過一趟排序將待排序表劃分為獨立的

兩部分L[1..k-1]和L[k+1 .. n],使得第一部分中的所有元素值都小于pivot,而第二部分中的所有元素值都大于pivot,

則基準元素放在了其最終位置L(K)上,這個過程為一趟快速排序。而后分別遞歸地對兩個子表重復上述過程,直到每

部分內只有一個元素或為空為止,即所有元素都放在了其最終位置上。

*/

intPartition(ElemTypearr[],intleft,intright)

{

ElemTypepivot = arr[left];//以當前表中第一個元素為樞軸值

while(left < right)

{

//從右向左找一個比樞軸值小的元素的位置

while(left < right && arr[right] >= pivot)

{

--right;

}

arr[left] = arr[right];//將比樞軸值小的元素移動到左端

//從左向右查找比樞軸值大的元素的位置

while(left < right && arr[left] <= pivot)

{

++left;

}

arr[right] = arr[left];//將比樞軸值大的元素移動到右端

}

arr[left] = pivot;//將樞軸元素放在最終位置

returnleft;

}

voidQuickSort(ElemTypearr[],intleft,intright)

{

if(left < right)

{

intpivotPos =Partition(arr, left, right);//劃分

QuickSort(arr, left, pivotPos -1);//快速排序左半部分

QuickSort(arr, pivotPos +1, right);//快速排序右半部分

}

}

六、簡單選擇排序算法

/*

6、簡單選擇排序算法

基本思想:

假設排序表為L[1...n],第i趟排序從表中選擇關鍵字最小的元素與Li交換,第一趟排序可以確定一個元素的

最終位置,這樣經過n-1趟排序就可以使得整個排序表有序。

*/

voidSelectSort(ElemTypearr[],intlength)

{

inti, j, min;

ElemTypetmp;

for(i =0; i < length -1; ++i)//需要n-1趟

{

min = i;

for(j = i +1; j < length; ++j)

{

if(arr[j] < arr[min])//每一趟選擇元素值最小的下標

{

min = j;

}

}

if(min != i)//如果第i趟的Li元素值該趟找到的最小元素值,則交換,以使Li值最小

{

tmp = arr[i];

arr[i] = arr[min];

arr[min] = tmp;

}

}

}

七、堆排序算法

/*

7、堆排序算法

堆的定義如下:n個關鍵字序列號L[1..n]稱為堆,僅當該序列滿足:

1)L(i) <= L(2i)且L(i) <= L(2i+1)或2)L(i) >= L(2i)且L(i) >= L(2i+1)

滿足第一種情況的堆,稱為小根堆(小頂堆);

滿足第二種情況的堆,稱為大根堆(大頂堆)。

*/

voidHeapAdjust(ElemType*a,inti,intsize)//調整堆

{

intlchild =2* i;//i的左孩子節點序號

intrchild =2* i +1;//i的右孩子節點序號

intmax = i;//臨時變量

if(i <= size /2)//如果i是葉節點就不用進行調整

{

if(lchild <= size && a[lchild] > a[max])

{

max = lchild;//左孩子比雙親值還大,需要調整

}

if(rchild <= size && a[rchild] > a[max])

{

max = rchild;//右孩子比雙親值還大,需要調整

}

if(max != i)//需要調整

{

ElemTypetmp = a[max];

a[max] = a[i];

a[i] = tmp;

HeapAdjust(a, max, size);//避免調整之后以max為父節點的子樹不是堆

}

}

}

voidBuildHeap(ElemType*a,intsize)//建立堆

{

for(inti = size /2; i >=0; i--)//非葉節點最大序號值為size/2

{

HeapAdjust(a, i, size);

}

}

voidHeapSort(ElemType*a,intsize)//堆排序

{

BuildHeap(a,size);

for(inti = size -1; i >=0; i--)

{

swap(a[0], a[i]);//交換堆頂和最后一個元素,即每次將剩余元素中的最大者放到最后面

BuildHeap(a, i-1);//將余下元素重新建立為大頂堆

HeapAdjust(a,1,i-1);//重新調整堆頂節點成為大頂堆

}

}

voidDisplay(ElemType arr[],intlength)

{

for(inti =0; i < length; ++i )

{

cout << arr[i] <<" ";

}

cout << endl;

}

intmain()

{

ElemType arr[] = {2,1,5,3,4,0,6,9, -1,4,12};

HeapSort(arr,sizeof(arr) /sizeof(ElemType));

Display(arr,sizeof(arr) /sizeof(ElemType));

return0;

}

謝謝!!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容

  • 概述 排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    蟻前閱讀 5,210評論 0 52
  • 概述:排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,740評論 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,266評論 0 2
  • 深蹲,健身動作之王。 無論是大到增肌、減脂; 還是小到翹臀、美腿,都靠它。 有句話叫:無深蹲不健身,無深蹲不翹臀。...
    硬派健身閱讀 1,954評論 2 7
  • 憤怒,生氣,也知道原來社會還是可以有這樣,其實說,一直知道的,但不敢相信。 人性真的能為了金錢去做一些違背自己意愿...
    DeathKnightR閱讀 193評論 0 0