归并排序

归并排序的原理:查看此处

  1.  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>

 

 

posted @ 2012-09-11 17:35  Red Candle  阅读(184)  评论(1编辑  收藏  举报