题目描述
快速排序思想
快排是基于“分治”来做的
1)首先在要排序的一串数里找出一个数x作为分界点,使该数左边的数都小于等于x,右边的数都大于等于x。
2)然后采用同样的方法递归,给左右两边分别排序。
题解
第一步:将要排序的数存到一个数组下标为从l到r的数组q[]里
for ( i = 0; i < n; i++)
{
scanf("%d ",&q[i]);
}
第二步:选取一个分界点x,在这里我直接选中间的那个数作为分界点
x = q[(l+r)/2]
//注意:选取分界点时,最好不要选边界值,
//否则当排序规模较大的时候代码运行时间会过长
//建议选择中间值或随机选择
第三步:使用i,j作为一个移动指针循环判断左右两边的数,若左边碰到大于或等于x的数,右边碰到小于或等于x的数则停下,交换两边的数
直到i>=j,再使用quik_sort递归给x左右两边的数排序
void quik_sort(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[(l+r)/2];
while (i < j)
{
do i++; while (q[i] < x);
do j--; while (q[j] > x);
if(i<j) swap(&q[i], &q[j]);
}
quik_sort(q, l, j);
quik_sort(q, j + 1, r);
}在这里插入代码片
完整代码
#include<stdio.h>
#include<stdlib.h>
void quik_sort(int q[], int l, int r);
void swap(int*,int*);
int main(void)
{
int n;
scanf("%d",&n);
int * q = (int*)malloc(n*sizeof(int));
int i;
for(i=0; i<n; i++) scanf("%d",&q[i]);
quik_sort(q,0,n-1);
for(i=0; i<n; i++) printf("%d ",q[i]);
free(q);
return 0;
}
void quik_sort(int q[], int l, int r)
{
if(l>=r) return;
int i=l-1, j=r+1,x=q[(l+r)/2];
while(i<j)
{
do i++; while(q[i]<x);
do j--; while(q[j]>x);
if(i<j) swap(&q[i],&q[j]);
}
quik_sort(q,l,j);
quik_sort(q,j+1,r);
}
void swap(int* i,int* j)
{
int temp;
temp = *i;
*i = *j;
*j = temp;
}