voidmergeSort(intarr[],intn){int*tmp=malloc(sizeof(int)*n);if(tmp!=NULL){mergeSortHelper(arr,tmp,0,n-1);free(tmp);}else{printf("No space for tmp array!\n");}}voidmergeSortHelper(intarr[],inttmp[],intleft,intright){if(left<right){intcenter=(left+right)/2;mergeSortHelper(arr,tmp,left,center);mergeSortHelper(arr,tmp,center+1,right);merge(arr,tmp,left,center+1,right);}}voidmerge(intarr[],inttmp[],intleftPos,intrightPos,intrightEnd){intleftEnd=rightPos-1;inttmpPos=leftPosintnumElements=rightEnd-leftPos+1;while(leftPos<=leftEnd&&rightPos<=rightEnd)if(arr[leftPos]<=arr[rightPos])tmp[tmpPos++]=arr[leftPos++];elsetmp[tmpPos++]=arr[rightPos++];while(leftPos<=leftEnd)tmp[tmpPos++]=arr[leftPos++];while(rightPos<=rightEnd)tmp[tmpPos++]=arr[rightPos++];for(inti=0;i<numElements;++i,rightEnd--)arr[rightEnd]=tmp[rightEnd];}
voidquickSort(int*arr,intlen){quickSortHelper(arr,0,len-1);}voidquickSortHelper(int*arr,intleft,intright){if(left+cutoff<right){// Cutoff for small arraysintpivot=median3(arr,left,right);inti=left,j=right-1;while(1){while(arr[++i]<pivot);while(arr[--j]>pivot);if(i<j)swap(&arr[i],&arr[j]);elsebreak;}swap(&arr[i],&arr[right-1]);quickSortHelper(arr,left,i-1);quickSortHelper(arr,i+1,right);}elseinsertSort(arr+left,right-left+1);}intmedian3(int*arr,intleft,intright){intcenter=(left+right)/2;if(arr[left]>arr[center])swap(&arr[left],&arr[center]);if(arr[left]>arr[right])swap(&arr[left],&arr[right]);if(arr[center]>arr[right])swap(&arr[center],&arr[right]);swap(&arr[center],&arr[right-1]);returnarr[right-1];}voidswap(int*a,int*b){inttemp=*a;*a=*b;*b=temp;}
voidbucketSort(int*arr,intlen){int*bucket=malloc(sizeof(int)*len);if(bucket!=NULL){for(inti=0;i<len;i++)// Initialize Bucketbucket[i]=0;for(inti=0;i<len;i++)// Countingbucket[arr[i]]++;for(inti=0,j=0;i<len;i++){while(bucket[i]>0){arr[j++]=i;bucket[i]--;}}free(bucket);}else{printf("No space for bucket!\n");}}