C語言關於排序的十乙個函式

2021-09-25 22:37:59 字數 3112 閱讀 5847

1.二叉樹 堆排序 o(nlogn)

滿二叉樹: 葉子節點全部在同乙個高度,且除了葉子節點外,所有的節點都有左右子節點

一棵高度為h的滿二叉樹,一共有 (2^h-1) 節點

平衡二叉樹: 從任意乙個節點開始,它的左右子樹的高度差不會超過1

完全二叉樹: 除了最後一層的葉子節點必須是從左到右

大棧堆: 任意乙個根節點的值都要大於(或等於)左右子樹的所有的值 (完全二叉樹 從上到下 從大到小排列)

小棧堆: 任意乙個根節點的值都要小於左右子樹的值 (完全二叉樹 從上到下 從小到大排列)

把完全二叉樹調整成大棧堆(小棧堆),從最後乙個根節點(len/2-1)開始往前調整 ,每次迴圈將當前節點的值和子節點的值按從大到小排列,迴圈調整根節點即可完成大棧堆陣列.將大棧堆中最大值交換到最後乙個 len-1 節點上,再len-1個元素再次調整為大棧堆,迴圈len-1次後,陣列有序.

void swap(int *str1,int *str2)

void stackonesort(int arr,size_t len,int index)

if(big+1arr[big])

if(data < arr[big])else

} arr[index] = data;

}void stackbigsort(int arr,size_t len)

}void stacksort(int arr,size_t len)

}

2.氣泡排序 o(n^2)

迴圈比較兩個元素,較大值(往後移)冒出來,最後移到最後乙個,下一次再迴圈比較,重複後移到倒數第二個;迴圈結束後,陣列有序.

void selectsort(int arr,size_t len)

} if(max != i)

}}

4.雞尾酒排序 o(n^2)

每次記錄最大值和最小值的下標

最大值放末尾 最小值放開始

迴圈len/2次,陣列有序

void cooksort(int arr,size_t len)

if(arr[j]5.直接插入 o(n^2)

1,19,9,8,7,4,16,0,3,2,7,20,15,5,6,17,11,14

假設現在是第i個元素 前面i-1個元素都有序 把arr[i]插入到前面i-1元素中使陣列保持有序

void insertsort(int arr,size_t len)

arr[j+1] = data;

}

}

6.折半插入(二分插入) o(n^2)

void binaryinsertsort(int arr,size_t len)

arr[j+1] = data;

}}

7.希爾插入排序 o(nlogn)

void shellsort(int arr,size_t len)

arr[i+step] = data;

} }}

8.歸併排序 o(nlogn)

把兩個有序的陣列合併成乙個有序的陣列

void mergerarr(int arr,size_t left,size_t right)

int mid = (left+right)/2;

if(mid-left>=1)

merger(arr,left,mid);//對[left,mid]區間進行排序

if(right-mid-1>=1)

merger(arr,mid+1,right);//對[mid+1,right]區間進行排序

mergerarr(arr,left,right);//把[left,mid],[mid+1,right]兩部分有序的合併成乙個整體有序的

}void mergersort(int arr,size_t len)

9.快速排序 o(nlogn)

記下左右兩端的數序號[left,right],記錄乙個數比如說 data = arr[left] 序號

然後去left右邊 找乙個比 arr[left] 小的數放在左邊

後又去right左邊找乙個比 arr[left] 大的數放在右邊

迴圈直到最後

遞迴呼叫自己 執行每乙個數

void quick(int arr,int left,int right)	//查詢左邊的小於等於data的數

arr[i] = arr[j]; //放置在左邊i

while(i1)

if(right-i>1)

}void quicksort(int arr,size_t len)

10.計數(桶)排序 o(n)

適用於在某個比較小的區間內資料密度比較大的情況下

例:arr[10]=;

比對陣列 [min,max] 區間 尋找陣列內的數在這個區間內各個整數所佔的數量

void countsort(int arr,size_t len)que;

void init(que *que,size_t cap)

void push(que *que,t data)

que->m_vect[que->size++] = data;

}t pop(que *que)

void destroy(que *que)

bool isempty(que *que)

void reset(que *que)

void basesort(int arr,size_t len)

} que ps[10];

for(int i=0;i<10;i++)

int cnt = 0;

printf("%d \n",max);

while(max!=0)

for(int i=0;ipush(&ps[n%10],arr[j]);//按n%10放入相應的位置

} int m =0;

for(int j=0;j<10;j++)

reset(&ps[j]);//為max的下乙個位,復位

} }for(int i=0;i<10;i++)

}

vue十乙個生命週期函式

lang en charset utf 8 name viewport content width device width,initial scale 1.0 documenttitle head p1 p click title 站著 修改button div onclick test 銷毀bu...

十乙個常見的PHP安全細則

php本身再老版本有一些問題,比如在 php4.3.10和php5.0.3以前有一些比較嚴重的bug,所以推薦使用新版。另外,目前鬧的轟轟烈烈的sql injection也是在php上有很多利用方式,所以要保證安全,php 編寫是一方面,php的配置更是非常關鍵。我們php手手工安裝的,php的預設...

十乙個常見的PHP安全細則

php本身再老版本有一些問題,比如在 php4.3.10和php5.0.3以前有一些比較嚴重的bug,所以推薦使用新版。另外,目前鬧的轟轟烈烈的sql injection也是在php上有很多利用方式,所以要保證安全,php 編寫是一方面,php的配置更是非常關鍵。我們php手手工安裝的,php的預設...