演算法導論學習之三:排序之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排序
- 利用java實現插入排序、歸併排序、快排和堆排序Java排序
- 七、排序,選擇、冒泡、希爾、歸併、快速排序實現排序
- 排序演算法(氣泡排序,選擇排序,插入排序,希爾排序)排序演算法
- 桶排序 選擇,插入排序排序
- 排序演算法之 '歸併排序'排序演算法
- 演算法學習之選擇排序和堆排序:演算法排序
- 三種語言實現歸併排序(C++/Python/Java)排序C++PythonJava
- C#實現——十大排序演算法之選擇排序C#排序演算法
- 重學資料結構和演算法(四)之氣泡排序、插入排序、選擇排序資料結構演算法排序
- 三言兩語講排序演算法——插入排序排序演算法
- php實現 歸併排序,快速排序PHP排序
- 演算法學習 – 歸併排序演算法排序
- 演算法學習 - 歸併排序演算法排序
- 排序演算法__歸併排序排序演算法
- 排序演算法:歸併排序排序演算法
- 排序演算法 - 歸併排序排序演算法
- 排序演算法(歸併排序)排序演算法
- 歸併排序--排序演算法排序演算法
- 排序演算法之「歸併排序(Merge Sort)」排序演算法
- 圖解選擇排序與插入排序圖解排序
- 排序演算法-C語言實現排序演算法C語言
- PHP 排序演算法之選擇排序PHP排序演算法
- Python排序演算法之 選擇排序Python排序演算法
- 排序演算法之「選擇排序(SelectionSort) 」排序演算法
- 演算法之常見排序演算法-氣泡排序、歸併排序、快速排序演算法排序
- 歸併排序MergeSort的C實現排序
- PHP 常見4種排序 氣泡排序、選擇排序、插入排序、快速排序PHP排序
- C語言排序 冒泡 選擇 快排C語言排序
- C++快速排序與歸併排序的實現(LeetCode 912)C++排序LeetCode
- Sort排序專題(7)歸併排序(MergeSort)(C++實現)排序C++
- 演算法之歸併排序演算法排序
- PHP 排序演算法之插入排序PHP排序演算法
- 排序演算法之折半插入排序排序演算法
- 【小小前端】前端排序演算法第一期(氣泡排序、選擇排序、插入排序)前端排序演算法