# Sort algorithm ## Merge Sort Array ```c= #include<stdio.h> #include<stdlib.h> void merge(int a[],int l,int m,int r){ int n1=m-l+1; int n2=r-m; int L[n1]; int R[n2]; int i,j; for(i=0;i<n1;i++) L[i]=a[l+i]; for(j=0;j<n2;j++) R[j]=a[(m+1)+j]; //from m+1 to (m+1)+j i=0; j=0; while(i<n1 && j<n2){ if(L[i]<R[j]){ a[l]=L[i]; l++; i++; } else { a[l]=R[j]; l++; j++; } } while(i<n1){//left have a[l]=L[i]; l++; i++; } while(j<n2){//right have a[l]=R[j]; l++; j++; } } void merge_sort(int a[],int l,int r){ if(l<r){ int mid=l+(r-l)/2; //divide merge_sort(a,mid+1,r); merge_sort(a,l,mid); //merge; merge(a,l,mid,r); } } int main() { int a[]={12,11,13,5,6,14}; //printf("%d\n",sizeof(a)/sizeof(a[0])); int size=sizeof(a)/sizeof(a[0]); merge_sort(a,0,size-1); for(int i=0;i<size;i++){ printf("%d ",a[i]); } return 0; } ``` ## Quick Sort Array ```c= #include<stdio.h> void swap(int *a,int *b ){ int temp=*a; *a=*b; *b=temp; } int partition(int a[],int low,int high){ int pivot=a[high]; int i=low-1;// Index of smaller element for(int j=low;j<=high-1;j++){//Traverse elements from j = low to high-1 // If current element is smaller than the pivot if(a[j]<pivot){ i++; swap(&a[i],&a[j]);// increment index of smaller element } } swap(&a[i+1],&a[high]); return i+1; } void quick_sort(int a[],int low,int high){ if(low<high){ //divide int pivot=partition(a,low,high); quick_sort(a,pivot+1,high); quick_sort(a,low,pivot-1); } } int main() { int a[]={10,5,1,5,6}; printf("%d\n",sizeof(a)/sizeof(int)); int size=sizeof(a)/sizeof(int); quick_sort(a,0,size-1); for(int i=0;i<size;i++){ printf("%d ",a[i]); } return 0; } ``` ## Heap Sort Array ```c= #include<stdio.h> #include<stdlib.h> void swap(int *a,int *b){ int tmp=*a; *a=*b; *b=tmp; } void heapify(int arr[],int n,int i){//6, int max_index=i; int l=2*i+1; int r=2*i+2; if(l<n&&arr[max_index]<arr[l]){ max_index=l; } if(r<n&&arr[max_index]<arr[r]){ max_index=r; } if(max_index!=i){ swap(&arr[max_index],&arr[i]); heapify(arr,n,max_index);//最大值的位置改到max_index } } void heap_sort(int arr[],int n){//6 for(int i=n/2-1;i>=0;i--){ heapify(arr,n,i); } for(int i=n-1;i>0;i--){ swap(&arr[0],&arr[i]); heapify(arr,i,0); } } int main() { int a[]={12,11,13,5,6,14}; //printf("%d\n",sizeof(a)/sizeof(a[0])); int size=sizeof(a)/sizeof(a[0]); heap_sort(a,size); for(int i=0;i<size;i++){ printf("%d ",a[i]); } return 0; } ``` ## Selection Sort Array ```c= #include<stdio.h> #include<stdlib.h> void swap(int *a,int *b){ int tmp=*a; *a=*b; *b=tmp; } void select_sort(int arr[],int size){//4 int i,j; int min; for(i=0;i<size-1;i++){//0,3 min=i; for(j=i;j<size;j++){ if(arr[j]<arr[i]){ min=j;//找出unsorted中,最小的位置 swap(&arr[min],&arr[i]); //對unsorted的第一個位置做交換 } } } } int main() { int a[]={9,1,5,6}; //printf("%d\n",sizeof(a)/sizeof(a[0])); int size=sizeof(a)/sizeof(a[0]); select_sort(a,size); for(int i=0;i<size;i++){ printf("%d ",a[i]); } return 0; } ``` ## Bubble Sort Array ```c= #include<stdio.h> #include<stdlib.h> void swap(int *a,int *b){ int tmp=*a; *a=*b; *b=tmp; } void bubble_sort(int arr[],int size){//4 for(int i=0;i<size-1;i++){//排序的次數=4-1 for(int j=0;j<size-i-1;j++){//排序一個需要的移動次數=4-i-1,-1是因為for裡面有swap((arr+j),(arr+j+1)); if(arr[j]>arr[j+1]){//把大的放右邊 swap((arr+j),(arr+j+1)); //swap(&arr[i],&arr[j]); } } } } int main() { int a[]={9,1,5,6}; printf("%d\n",sizeof(a)/sizeof(int)); int size=sizeof(a)/sizeof(int); bubble_sort(a,size); for(int i=0;i<size;i++){ printf("%d ",a[i]); } return 0; } ``` ## qsort()在C語言 是 **#include <stdlib.h>** 中的一個function。 ### h3使用方法 以下方的變數作介紹, **base** 是想要排序的序列,可以放入array的形式, **nitems**是裡面含有多少的元素, **size**是指資料的儲存形式,例如:int。 **compar**是比較的規則,傳入一個int function,利用兩數字相減作為判斷依據。 ```c= void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*) ``` ```c= #include <stdio.h> #include <stdlib.h> int values[] = { 88, 56, 100, 2, 25 }; int cmpfunc (const void * a, const void * b) { return ( *(int*)a - *(int*)b );//>0,=0,<0 } int main() { int n; printf("Before sorting the list is: "); for( n = 0 ; n < 5; n++ ) { printf("%d ", values[n]); } qsort(values, 5, sizeof(int), cmpfunc); //void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)) printf(" After sorting the list is: "); for( n = 0 ; n < 5; n++ ) { printf("%d ", values[n]); } return(0); } ```