快速排序
void quick_sort(int a[],int l,int r)
{
int i = l - 1, j = r + 1, x = a[(l + r)/2];//赋初值
if (l >= r)return;//循环截止
while (i < j)//当i指针<j指针时,不断循环
{
do i++; while (a[i] < x);//分堆
do j--; while (a[j] > x);
if (i < j)//只有当i在j左边时,才执行交换操作
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
quick_sort(a, l, j); quick_sort(a, j + 1, r);//不断递归
}
//代码模板来自y总
以下是个人思路及观点,仅供参考:
第一步找到分割点,我比较喜欢中点;
第二步分治递归,利用双指针,把小于x的放i指针左边,把大于x的放j指针的右边,出现相悖的值就交换i,j所指向的值;
第三步 直到i>=j时停止,模板在递归时,是先读值,再进行比较,所以对函数传入的值有所要求;
归并排序
void merge_sort(int q[], int l, int r)
{
if (l >= r) return;
int mid = l + r >> 1;
merge_sort(q, l, mid);
merge_sort(q, mid + 1, r);
int k = 0, i = l, j = mid + 1;
while (i <= mid && j <= r)
if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
else tmp[k ++ ] = q[j ++ ];
while (i <= mid) tmp[k ++ ] = q[i ++ ];
while (j <= r) tmp[k ++ ] = q[j ++ ];
for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
}
//代码模板来自y总
以下仅个人观点,仅供参考:
归并排序更像是穿针引线;
第一步:分治递归,把数组一分为二;
第二步:通过双指针,用第三个数组把比较的值存起来;
第三步:如果还有剩下的就全部仍在第三数组里;