常用排序演算法實現 C語言

2021-09-13 20:27:38 字數 4429 閱讀 2515

排序演算法原理都不難,實現起來卻沒那麼簡單,特別是一些邊界問題的處理。

前些天把這些常有的排序演算法實現了一遍,**寫的也不太好,很多i,j,k之類的變數,也很多迴圈巢狀,不過初步測試是正確的。 1

#include 

<

stdio.h

>23

void

swap(

int*

a, int

*b);        

//交換兩個整數

4void

output_arr(

intarr, 

intn);    

//輸出陣列56

void

strai_sort(

intarr, 

intn);    

//直接插入排序

7void

bubble_sort(

intarr, 

intn);    

//氣泡排序89

intqpass(

intarr, 

inti, 

intj);    

//一趟快速排序

10void

qsort(

intarr, 

ints, 

intt);    

//快速排序

1112

void

sift(

intarr, 

intn, 

intk);        

//堆排序一趟篩選

13void

makeheap(

intarr, 

intn);        

//建堆

14void

heapsort(

intarr, 

intn);        

//堆排序

1516

void

merge(

intarr, 

intlow, 

intmid, 

inthigh);    

//合併

17void

mergesort(

intarr, 

intlow, 

inthigh);        

//歸併排序

1819

20static

inttemp[

100];

2122

intmain(

intargc, 

char

**ar**)23;

2526

printf(

"before sort:");

27output_arr(arr, 

sizeof

(arr)

/sizeof

(arr[

0]));

2829

//strai_sort(arr, sizeof(arr)/sizeof(arr[0]));

30//

bubble_sort(arr, sizeof(arr)/sizeof(arr[0]));

31//

qsort(arr, 0, sizeof(arr)/sizeof(arr[0])-1);    

32//

heapsort(arr, sizeof(arr)/sizeof(arr[0]));    

33mergesort(arr, 0, 

sizeof

(arr)

/sizeof

(arr[0])

-1);34

35printf(

"after sort:");

36output_arr(arr, 

sizeof

(arr)

/sizeof

(arr[

0]));    

3738

return0;

39}4041

void

swap(

int*

a, int*b)

4248

49void

output_arr(

intarr, 

intn)

5056

57/*

58* 直接插入排序

59* 思想: 依次把 無序序列裡的值 插入 到有序序列裡;初始時,有序序列為arr[0],無序序列為arr[1]

60* 這種演算法要不斷的比較、移動資料,效能很差

61*/

62void

strai_sort(

intarr, 

intn)

6378

arr[j] 

=temp;

79break;80

}81}82

}        83}

8485

/*86

* 氣泡排序原理:

87* 對n個整數,將最大數放到最後,即第n個位置

88* 然後剩餘n-1個數,把剩餘n-1個數中最大的放到最後,即第n-1個位置

89* 依次對前n-2 n-3個數處理,最後得到有序序列

90*/

91void

bubble_sort(

intarr, 

intn)

92101

}102

}103

104/*

105* 一趟快速排序:

106* 這裡選擇開始位置整數為標點,即第i個元素為標點

107* 從後向前,找到比標點小的元素,跟標點交換位置;然後再從前向後,找到比標點大的元素後,跟標點交換位置

108* 即不斷把比標點小的元素移動標點左邊,比標點大的元素移到標點右邊

109* 一趟快速排序快速排序後,標點元素就在乙個正確位置上

110*/

111int

qpass(

intarr, 

inti, 

intj)

112123

j -=1;

124}

125while

(i <

j)126

133i +=1

;134

}135

}136

137return

i;138

}139

140void

qsort(

intarr, 

ints, 

intt)

141149

}150

151/*

152* 堆排序

153*/

154155

//arr[k+1]滿足大頂堆的性質

156//

新元素arr[k],左右孩子分別為arr[2*k+1]、arr[2*k+2]

157//

交換arr[k]和其左右孩子中較大的值,直到比其左右孩子都大 或者 到了序列邊界

158void

sift(

intarr, 

intn, 

intk)

159176

}177

}178

//對陣列arr建堆

179//

初始時,arr[n/2]都是葉子節點,即arr[n/2]滿足大頂堆的性質

180void

makeheap(

intarr, 

intn)

181186

187void

heapsort(

intarr, 

intn)

188198

}199

200/*

201*arr[low]

202* 合併這兩個有序子串行為乙個有序序列 

203*/

204void

merge(

intarr, 

intlow, 

intmid, 

inthigh)

205214

215k 

=low;

216217

while

( i<=

mid &&j

<=

high )

218224

while

( i<=

mid )

225228

while

( j<=

high )

229232

}233

234/*

235* 歸併排序原理:

236* 把乙個無序序列中的每個元素視為有序子串行,把這些子串行兩兩合併成有序子串行

237*/

238void

mergesort(

intarr, 

intlow, 

inthigh)

239248

}249

常用排序演算法的C語言實現

最近看資料結構,把常用的排序演算法用c語言寫了一下。沒有按資料結構上的定義sqlist結構體,只是用陣列的形式實現。有的演算法並沒有完全按書上給出的演算法,但思路一致。includevoid insertsort int,int 直接插入排序 無哨兵 void binsertsort int,int...

C語言常用排序演算法原理及實現

一 氣泡排序思路 每次冒泡,從第0個元素開始,相鄰兩個元素之間進行比較 如果元素大,則往後冒,否則不作交換 這樣,一次冒泡 即一層迴圈 下來之後,就可以確定乙個最大值且排在最後的位置 接下來的迴圈就對剩餘的元素重複之前的操作,相鄰相比,大者冒泡,找到第二大元素 以此類推,直到最後所有元素都到了相應的...

常用排序演算法 C實現

1.1 氣泡排序 演算法描述 所給的n個數中,先拿第乙個數來和第二個比較,然後讓較大的乙個排在後面 即如果n1 n2,則讓n1與n2交換位置 然後又拿第二個數來和第三個數比較,又把較大的乙個排在後面,如此往下做下去,直到第n 1個數和第n個數比較完後,最大的那個數就會被公升到了最後面來.接下來又照同...