归并排序
快排:先排再递归
归并:先递归再排
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]