快速排序算法

来源:互联网 发布:阿里云病毒入侵 编辑:程序博客网 时间:2024/05/19 22:57
void sv(int* buffer,int j,int i){        buffer[i] = buffer[i] ^ buffer[j];        buffer[j] = buffer[i] ^ buffer[j];        buffer[i] = buffer[i] ^ buffer[j];}void foo(int* buffer,int bag,int end){    int i = bag;    int j = end;    int k = i;    while (1)    {        if (k == i)        {            if (buffer[i] > buffer[j])            {                sv(buffer, i, j);                k = j;                i++;            }            else            {                j--;            }        }        else if (buffer[i] > buffer[j])        {            sv(buffer, i, j);            k = i;            j--;        }        else        {            i++;        }        if (i == j)        {            if (k + 1 < end)            {                foo(buffer, k + 1, end);            }            if (bag < k - 1)            {                foo(buffer,bag,k-1);            }               return;        }    }}int main(){    int buffer[] = { 7,3,8,2,6,9,1 };    int n = sizeof(buffer) / sizeof(int);    foo(buffer,0,n-1);    for (int i = 0; i < n; i++)    {        printf("%d ", buffer[i]);    }    system("pause");    return 0;}

分两种情况:第一种让左边的数跟右边最后一个数比较比他大时交换位置,左边的数进一格中间如果还有比右边大的数继续交换,然后i继续进一格一直到i和j重合为止;
第二种如果i=k时;i刚好是最小数那j就需要一直走到头;
给个条件
(当i和j在尾部重合时把头向前移动)或(当i和j在头部重合时把尾部向前移动),然后重复排序的动作,直到位置是有序的为止;
当排序排好后i和j将会在end重合;k+1>end k-1

原创粉丝点击