归并排序

快排:先排再递归

归并:先递归再排

1. 确定分界点

左右两边的一半 mid = (l + r) . 2

2. 递归排序left, right

3. 归并,将两个有序的合二为一

复杂度分析

 

 1 void merge_sort(int q[], int l, int r)
 2 {
 3     if(l >= r) return;
 4     int mid = l + r >> 1;
 5     
 6     merge_sort(q, l, mid), merge_sort(q, mid+1, r);
 7     
 8     int k = 0, i = l, j = mid + 1;
 9     while(i <= mid && j <= r)
10         if(q[i] <= q[j]) temp[k++] = q[i++];
11         else temp[k++] = q[j++];
12     while(i <= mid) temp[k++] = q[i++];
13     while(j <= r) temp[k++] = q[j++];
14     
15     for(i = l, j = 0; i <= r; i++, j++) q[i] = temp[j];
16 }

 

 

算法:双指针

1. 初始化

2. 比较i,j所指元素

取出i所指元素,i++

res = [1]

3. 比较i,j所指元素

取出j所指元素, j++

 

res = [1, 2]

4. 比较i,j所指元素

取出i所指元素, i++

res = [1, 2, 3]

 

6. 比较i,j所指元素

取出i所指元素, j++

res = [1, 2, 3, 4]

7. 比较i,j所指元素

取出i所指元素, i++

 

res = [1, 2, 3, 4, 5]

8. 比较i,j所指元素

取出j所指元素, j++

res = [1, 2, 3, 4, 5, 5]

9. 比较i,j所指元素

取出i所指元素, i++

 

res = [1, 2, 3, 4, 5, 5, 7]

10. 比较i,j所指元素

取出j所指元素, j++

 

 

res = [1, 2, 3, 4, 5, 5, 7, 8]

11. 比较i,j所指元素

取出i所指元素, i++

res = [1, 2, 3, 4, 5, 5, 7, 8, 9]

12.把j所指元素及j之后的元素都添加至res数组中

res = [1, 2, 3, 4, 5, 5, 7, 8, 9, 10]

posted @ 2019-07-08 02:09  roov  阅读(5)  评论(0编辑  收藏  举报