演算法導論 排序的9種實現 C C

2021-07-24 20:23:19 字數 4156 閱讀 3474

《演算法導論》中並沒有討論這麼多排序演算法。在此羅列出來,僅僅是為了今後便於檢視。基數排序、桶排序後續補充。。。。。

氣泡排序有很多種實現方式。下面總結常見的幾種,並對氣泡排序進行改進。

氣泡排序1

//冒泡公升序排序1,強烈推薦,好記

void bubblesort(int arr,int

length) }}

}

冒泡公升序排序2

void bubblesort(int arr,int

length) }}

冒泡公升序排序3

void bubblesort(int arr,int

length) }}

冒泡公升序排序4(對冒泡1進行優化,冒泡2、3同理可以優化)

void bubblesort(int arr,int

length) }}

}

選擇排序時間複雜度為o(

n2) ,是乙個不穩定的演算法。

void selectionsort(int arr,int

length)

if(minpos!=i)}}

插入排序時間複雜度為o(

n2) ,是乙個穩定的演算法。

插入排序c實現1

void insectionsort(int arr,int

length)

arr[j+1]=tmp;}}

插入排序c實現2

void insectionsort(int arr,int

length)

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

折半插入排序僅僅減少了比較元素的次數,約為o(

nlog2n

) ,且比較次數與待排陣列的初始化狀態無關。而元素的移動次數沒有改變,移動次數依賴於陣列的初始化狀態。時間複雜度為o(

n2) ,是乙個穩定演算法。

void binaryinsectionsort(int arr,int

length)

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

arr[high+1]=tmp;}}

歸併排序和快速排序都是分治演算法的思想,但又明顯的不同,對照學習會有更大收穫。空間複雜度為o(

n),時間複雜度為o(

nlog2n

) ,2-路歸併排序演算法是乙個穩定的排序演算法。

多數教材上僅僅寫出偽演算法,所以下面貼出可執行的c**。其中merge函式是重點,有些教材上都寫錯了。一點要小心。

#include 

#include

#define max 100

int arr[max];

void merge(int arra,int low,int middle,int high)

while(i<=middle)

while(j<=high)

for(i=low,k=0; i<=high; k++, i++)

delete arrb;

}void mergesort(int arr,int low,int high)

}void printarray(int arr,int length)

}int main()

printf("排序前資料為:");

printarray(arr,num);

mergesort(arr,0,num-1);

printf("排序後資料為:");

printarray(arr,num);

return

0;}

merge函式的第二種實現方式

int arrb[max];              //把輔助陣列arrb定義在全域性範圍。也省得delete操作了

void merge(int arra,int low,int middle,int high)

while(i<=middle)

while(j<=high)

}

merge函式的第三種實現方式

//左右兩個子陣列,分別設定乙個哨兵,避免每次比較都必須檢查子陣列是否為空,從而簡化**。

//僅給出偽**,詳細解釋請翻閱《演算法導論》17頁。

快速排序是一種非常重要的排序,在學習程式設計、資料結構、演算法設計與分析等課程的時候,老師三令五申,多次講到。這裡僅僅貼出實現方式。

快速排序演算法的詳細設計思路請參考另一篇博文:演算法導論——-快速排序quicksort  快速排序演算法中,最重要的就是partition函式。partition函式有好幾個實現方式。請參考另外一篇博文:(後續補上)

//交換陣列中兩個元素位置

void swap(int &a,int & b)

int partition(int * arr,int low,int high)

if (i//注意這裡是交換元素,另外還有挖坑法實現,是元素覆蓋。

}/* 令i自i位置開始向右掃瞄,如果i位置所對應的元素的值小於等於pivot,則i後移(即i++)。

重複該過程,直至找到第乙個大於pivot的元素r[i],將r[i]與r[j]進行交換,j--。

其實,交換後r[i]所對應的元素就是pivot。*/

while (iif (ireturn i; //i和j相同,即基準元素pivot的最終位置。返回i的值

}void quicksort(int * arr,int low,int high)

}

希爾排序是對插入排序的乙個改進演算法。排序的思路和演算法分析,詳見另一篇博文。演算法導論——shellsort希爾排序

void shellsort (int a, int n)

for (k=0; k<16; k++)

a[j]=tmp;}}

}

堆排序是一種基於完全二叉樹的樹形選擇排序 方法。在排序的過程中將待排序列看成是一顆完全二叉樹的順序儲存結構,樹上的每乙個結點對應陣列中的乙個元素,可以利用完全二叉樹中雙親結點和孩子結點之間的內在關係,在當前無序序列中構建「二叉堆」,簡稱「建堆」操作。從而在二叉堆的根部找到關鍵字最大(小)的元素。這種叫「堆」的資料結構可以儲存每趟排序過程中的中間比較結果。堆按性質可分為大頂堆和小頂堆。如果想讓序列按公升序(降序)排序,就需要將待排序的n個元素構造成大頂堆(小頂堆)。此時堆頂即為最大值(最小值),將它和堆陣列的尾元素交換。然後將剩餘的n-1個待排元素重新建堆,從而得到n個元素中的次大元素,將它和堆陣列的尾元素交換。反覆迭代,最終得到乙個有序的序列。關於堆排序更詳細的解釋,請參考另一篇博文:演算法導論——堆排序heapsort

#include 

#include

int arrtest[100];

void swap(int

*a,int

*b)

void maxheapify(int arr,int i,int heapsize)

}void buildmaxheap(int arr,int heapsize)

}void heapsort(int arr,int len)

}void printarray(int arr,int

length)

}int main()

printf("排序前資料為:");

printarray(arrtest,num);

heapsort(arrtest,num);

printf("排序後資料為:");

printarray(arrtest,num);

return

0;}

排序演算法的實現 C C 實現

存檔 1 include 2 include 3 include 4 define maxsize 20 5using namespace std 6int main 749 cout 50 cout 請重新輸入您的選擇 51 cin num 52 53return0 54 1 typedef st...

演算法導論 快速排序實現

package search 快速排序演算法導論 public class quicksort1 quicksort1 q new quicksort1 q.quicksort arr,0,arr.length 1 q.print1 arr 合併 public void quicksort int ...

演算法導論 c 實現計數排序

計數排序的基本思想為 對每乙個輸入的元素x,確定出小於x的元素的個數。有了這一資訊,那麼就可以把x直接放到相應的位置上。特點 1 需要臨時的儲存空間,如果排序資料範圍特別大時,空間開銷很大。2 適合於排序0 100以內的資料。3 排序的時間複雜度為o n include include const ...