演算法導論學習之三:排序之C語言實現:選擇排序,插入排序,歸併排序
一、選擇排序
原理圖:
選擇排序是先找到起始陣列中最小的元素,將它交換到i=0;然後尋找剩下元素中最小的元素,將 它交換到i=1的位置…… 直到找到第二大的元素,將它交換到n-2的位置。這時,整個陣列 的排 序完成。
#include<stdio.h>
void select_sort(int a[], int ac) ;
void swap(int *a,int *b);
void print(int arr[],int ac);
int main(void){
int a[] = {2,1,4,3,2,0,-10,58,-20};
int ac = sizeof(a)/sizeof(a[0]);
select_sort(a,ac);
print(a,ac);
return 0;
}
//選擇排序函式
void select_sort(int a[], int ac)
{
/*呼叫 swap*/
int i,j;
int min_idx;
for(j = 0; j < ac-1; j++){
bool flag = 0;
min_idx = j;
for(i = j+1; i < ac; i++){
if(a[i] <= a[min_idx]) {
min_idx =i;
flag = 1;
}
}
if(flag){
swap(&a[j], &a[min_idx]);
}
print(a,ac);
}
}
//交換函式swap()
void swap(int *a,int *b){
*a = *a^*b;
*b = *a^*b;
*a = *a^*b;
}
//輸出函式 print
void print(int arr[],int ac){
//輸出排好的陣列
for(int i = 0;i<ac;i++){
printf(" %d",arr[i]);
}
printf("\n");
}
執行結果如圖:
二、插入排序
#include<stdio.h>
#include<stdlib.h>
void sort(int a[],int ac);
void print(int arr[],int ac);
int main(void){
int a[] = {2,1,4,3,2,0,-10,58,-20};
int ac = sizeof(a)/sizeof(a[0]);
//呼叫函式
sort(a,ac);
//輸出排好的陣列
for(int i = 0;i<ac;i++){
printf(" %d",a[i]);
}
return 0;
}
//插入排序函式
void sort(int a[],int ac){
int i,j;
for(j=1;j<ac;j++){
i=j-1;
while((i>=0)&&a[i+1]<a[i]){
//交換兩個數字
a[i+1] = a[i+1]^a[i];
a[i] = a[i+1]^a[i];
a[i+1] = a[i+1]^a[i];
i--;
}
print(a,ac);
}
}
//輸出函式 print
void print(int arr[],int ac){
//輸出排好的陣列
for(int i = 0;i<ac;i++){
printf(" %d",arr[i]);
}
printf("\n");
}
執行結果:
三、歸併排序(參考vamei)
/*By Vamei*/
/*recursively merge two sorted arrays*/
#include<stdio.h>
#include<stdlib.h>
void merge_sort(int *a, int ac);
void print(int arr[],int ac);
int main(void){
int a[] = {2,1,4,3,2,0,-10,58,-20};
//陣列長度
int ac = sizeof(a)/sizeof(a[0]);
merge_sort(a,ac);
print(a,ac);
}
//歸併排序
void merge_sort(int *a, int ac)
{
int i, j, k;
int ac1, ac2;
int *ah1, *ah2;
int *container;
/*如果分的為一個數字時候,跳出遞迴*/
if (ac <= 1) return;
/*將陣列一分為二*/
ac1 = ac/2;
ac2 = ac - ac1;
ah1 = a + 0;
ah2 = a + ac1;
/*recursion*/
merge_sort(ah1, ac1);
merge_sort(ah2, ac2);
/*merge*/
i = 0;
j = 0;
k = 0;
container = (int *) malloc(sizeof(int)*ac);
while(i<ac1 && j<ac2) {
if (ah1[i] <= ah2[j]) {
container[k++] = ah1[i++];
}
else {
container[k++] = ah2[j++];
}
}
while (i < ac1) {
container[k++] = ah1[i++];
}
while (j < ac2) {
container[k++] = ah2[j++];
}
/*copy back the sorted array*/
for(i=0; i<ac; i++) {
a[i] = container[i];
}
/*free space*/
free(container);
}
//輸出函式 print
void print(int arr[],int ac){
//輸出排好的陣列
for(int i = 0;i<ac;i++){
printf(" %d",arr[i]);
}
printf("\n");
}
相關文章
- 演算法導論學習之六:歸併排序演算法排序
- 選擇排序和插入排序(C++實現)排序C++
- Python八大演算法的實現,插入排序、希爾排序、氣泡排序、快速排序、直接選擇排序、堆排序、歸併排序、基數排序。Python演算法排序
- 歸併排序——C語言排序C語言
- php實現 氣泡排序,插入排序,選擇排序PHP排序
- 七、排序,選擇、冒泡、希爾、歸併、快速排序實現排序
- 排序演算法(氣泡排序,選擇排序,插入排序,希爾排序)排序演算法
- php插入排序,快速排序,歸併排序,堆排序PHP排序
- 排序(2)--選擇排序,歸併排序和基數排序排序
- 利用java實現插入排序、歸併排序、快排和堆排序Java排序
- 選擇排序和插入排序排序
- 排序演算法之 '歸併排序'排序演算法
- 演算法學習之選擇排序和堆排序:演算法排序
- 演算法導論學習之二:插入排序演算法排序
- (一)氣泡排序、選擇排序、插入排序排序
- 從零開書學演算法(導論)之歸併排序演算法排序
- JAVA小練習氣泡排序,選擇排序和插入排序Java排序
- 重學資料結構和演算法(四)之氣泡排序、插入排序、選擇排序資料結構演算法排序
- C#實現——十大排序演算法之選擇排序C#排序演算法
- 演算法學習 – 歸併排序演算法排序
- 演算法學習 - 歸併排序演算法排序
- 圖形化排序演算法比較:快速排序、插入排序、選擇排序、氣泡排序排序演算法
- 三言兩語講排序演算法——插入排序排序演算法
- 圖解選擇排序與插入排序圖解排序
- 排序演算法Python(冒泡、選擇、快速、插入、希爾、歸併排序)排序演算法Python
- php實現 歸併排序,快速排序PHP排序
- 排序演算法__歸併排序排序演算法
- 排序演算法:歸併排序排序演算法
- 歸併排序--排序演算法排序演算法
- 排序演算法 - 歸併排序排序演算法
- 排序演算法——歸併排序排序演算法
- 排序演算法(歸併排序)排序演算法
- 排序演算法總結之歸併排序排序演算法
- 排序演算法-C語言實現排序演算法C語言
- PHP 排序演算法之選擇排序PHP排序演算法
- 排序之選擇排序排序
- 演算法之常見排序演算法-氣泡排序、歸併排序、快速排序演算法排序
- PHP 常見4種排序 氣泡排序、選擇排序、插入排序、快速排序PHP排序