標籤:
之前熟悉C的時候寫著玩的,就當做筆記用吧:
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#define MAX 8void print_r(int *arr,int len);static void usage(void){ printf("-s selection sort\n" "-b show unsorted status\n" "-m merge sort\n" "-i insertion sort\n" "-I Information\n" "-h help and exit\n"); return;}static void usage_info(void){ printf("這是一個排序演算法的測試程式\n" "目前包括選擇排序,插入排序和合并排序\n"); return;}int* create_arr(int *arr){ srand(time(NULL)); int i; for(i=0;i<MAX;i++) { arr[i]=rand()%100; } return arr;}void insertion_sort(int arr[]){ int temp = 0,j = 0,i = 0; for(j = 1;j<MAX;j++) { i = j-1; temp = arr[j]; while(i >= 0 && arr[i] < temp) { arr[i+1] = arr[i]; i--; } arr[i+1] = temp; }}void selection_sort(int arr[],int len){ int i,j=0,index,key; for(i=0;i < len;i++) { key = arr[i]; index = i; j = i+1; while(j < len) { if(arr[j] < key) { key = arr[j]; index = j; } j++; } arr[index] = arr[i]; arr[i] = key; } }/** * start 數組開始下標 * mid 數組分割下標 * end 數組結束下標 */void merge(int arr[],int start,int mid,int end){ int szie_L,szie_R,i,j,k; szie_L = mid+1-start; //左數組大小 szie_R = end-mid; //右數組大小 int arr_L[szie_L],arr_R[szie_R]; for(i = 0;i < szie_L;i++) { arr_L[i] = arr[start+i]; } for(j = 0;j < szie_R;j++) { arr_R[j] = arr[mid+j+1]; } i = 0; j = 0; for(k = start;k <= end;k++) { if((i < szie_L) && (j < szie_R)) { if(arr_L[i] <= arr_R[j]) { arr[k] = arr_L[i]; i++; } else if(arr_L[i] > arr_R[j]) { arr[k] = arr_R[j]; j++; } } else if(j >= szie_R) { arr[k] = arr_L[i]; i++; } else { arr[k] = arr_R[j]; j++; } }}/** * start 數組開始下標 * end 數組結束下標 */void merge_sort(int arr[],int start,int end){ int mid; //用來分割數組的下標 if(start < end) { mid = (int)((start+end)/2); merge_sort(arr,start,mid); merge_sort(arr,mid+1,end); merge(arr,start,mid,end); }}void print_r(int *arr,int len){ int i; for(i=0;i<len;i++) { printf("[%d]=>%d\n",i,arr[i]); }}void main(int argc ,char **argv){ int i,c,sorted=0; int arr[MAX]; create_arr(arr); if(argc>1) { while(-1 != (c = getopt(argc,argv,"hsimIb"))) { switch(c) { case ‘b‘: printf("before sorting : \n"); print_r(arr,MAX); printf("=========================================\n"); break; case ‘h‘: usage(); break; case ‘s‘: selection_sort(arr,MAX); printf("selection sorting : \n"); sorted = 1; break; case ‘i‘: insertion_sort(arr); printf("insertion sorting : \n"); sorted = 1; break; case ‘m‘: merge_sort(arr,0,MAX-1); printf("merge sorting : \n"); sorted = 1; break; case ‘I‘: usage_info(); break; default : usage(); break; } } if(sorted) { print_r(arr,MAX); } } else { usage(); exit(0); }}
常用排序演算法集合-C實現