归并排序
归并排序的原理:查看此处
- C实现
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 5 const int NUM=10; 6 void mergeSort(int data[], int start, int end); 7 void merge(int data[], int start, int mid, int end); 8 void printArr(int arr[], int length); 9 10 void main(int argc, char *argv[]){ 11 int arr[NUM]; 12 int i; 13 srand((int)time(NULL)); 14 for(i=0; i<NUM; i++){ 15 arr[i] = (int)(30*rand()/(RAND_MAX+1.0)); 16 } 17 printArr(arr,NUM); 18 mergeSort(arr, 0, NUM-1); 19 printArr(arr, NUM); 20 } 21 22 void mergeSort(int data[], int start, int end){ 23 int mid; 24 if(start < end){ 25 mid = (start+end)/2; 26 mergeSort(data, start, mid); 27 mergeSort(data, mid+1, end); 28 merge(data, start, mid, end); 29 } 30 } 31 32 void merge(int data[], int start, int mid, int end){ 33 int leftLength, rightLength; 34 int *temp; 35 int tempStart = start; 36 int tempEnd = mid+1; 37 int tempkey = 0; 38 leftLength = mid - start + 1; 39 rightLength = end-start; 40 temp = (int *)malloc(sizeof(int) * (end-start+1)); 41 while(tempStart<=mid && tempEnd <= end){ 42 if(data[tempStart] > data[tempEnd]){ 43 temp[tempkey++] = data[tempEnd]; 44 tempEnd++; 45 }else{ 46 temp[tempkey++] = data[tempStart]; 47 tempStart++; 48 } 49 } 50 51 while(tempStart <= mid){ 52 temp[tempkey++] = data[tempStart++]; 53 } 54 55 while(tempEnd <= end){ 56 temp[tempkey++] = data[tempEnd++]; 57 } 58 tempkey = 0; 59 60 while(start+tempkey<=end){ 61 data[start+tempkey] = temp[tempkey]; 62 tempkey++; 63 } 64 65 free(temp); 66 } 67 void printArr(int arr[], int length){ 68 int i; 69 for(i=0; i<length; i++){ 70 printf("%d\t", arr[i]); 71 } 72 }
2.PHP实现
1 <?php 2 $arr = range(1,100); 3 $arr = array_rand($arr, 30); 4 shuffle($arr); 5 print_r($arr); 6 print_r(mergeSort($arr)); 7 8 function mergeSort(Array $arr){ 9 if(count($arr) == 1) return $arr; 10 $mid = floor(count($arr)/2); 11 return merge(mergeSort(array_slice($arr, 0, $mid)), mergeSort(array_slice($arr, $mid))); 12 } 13 14 function merge(Array $left, Array $right){ 15 $result = array(); 16 while(count($left) >0 && count($right) > 0){ 17 if($left[0] < $right[0]){ 18 array_push($result, array_shift($left)); 19 }else{ 20 array_push($result, array_shift($right)); 21 } 22 } 23 return array_merge($result, $left, $right); 24 } 25 ?>
3.javascript实现
1 <script> 2 //生成一个随机数组 3 var esnum = Math.ceil(Math.random()*100); 4 var eArr = new Array(esnum); 5 for(var i=0; i<eArr.length; i++){ 6 eArr[i] = Math.round(Math.random() * 100); 7 } 8 alert(eArr); 9 alert(mergeSort(eArr)); 10 11 function mergeSort(arr){ 12 if(arr.length == 1){ 13 return arr; 14 } 15 //求出分割终点 16 var mid = Math.floor(arr.length/2); 17 return merge(mergeSort(arr.slice(0,mid)), mergeSort(arr.slice(mid))); 18 } 19 20 function merge(left, right){ 21 var result = []; 22 while(left.length !=0 && right.length !=0){ 23 if(left[0] < right[0]){ 24 result.push(left.shift()); 25 }else{ 26 result.push(right.shift()); 27 } 28 } 29 return result.concat(left).concat(right); 30 } 31 </script>