排序演算法原理都不難,實現起來卻沒那麼簡單,特別是一些邊界問題的處理。
前些天把這些常有的排序演算法實現了一遍,**寫的也不太好,很多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個數比較完後,最大的那個數就會被公升到了最後面來.接下來又照同...