快速排序算法 冒泡排序

include

include

include

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

void main()
{
    int a[2][3] = { 3,2,1,6,5,4 };
    int i, j, k, b[6];
    int temp;
    int y, z;  //一维数组转换成二维数组时候用到 
    k = 0; //初始化 k 的值 

           //转换为一维数组 
    for (i = 0; i<2; i++)
    {
        for (j = 0; j<3; j++)
        {
            b[k] = a[i][j];
            k++;
        }
    }
    //对一维数组 b[6] 进行冒泡排序
    for (j = 0; j<5; j++)
    {
        for (i = 0; i<5 - j; i++)
        {
            if (b[i]>b[i + 1])
            {
                /*temp = b[i];
                b[i] = b[i + 1];
                b[i + 1] = temp;*/
                b[i] = b[i] ^ b[i + 1];
                b[i+1] = b[i] ^ b[i + 1];
                b[i] = b[i] ^ b[i + 1];
            }
        }
    }
    //再将排好序的一维数组 b[6]转换成二维数组 a[2][3],并按一定格式输出 
    //重新定义一个变量 y  z,是为了避免变量之间的冲突 
    for (y = 0; y<2; y++)
    {
        for (z = 0; z<3; z++)
        {
            a[y][z] = b[y * 3 + z];    //这一步要好好理解,为什么是 y*3+z ?很关键的一步 
        }
    }
    //输出 两行三列的二维数组 
    for (i = 1; i <= 2; i++)
    {
        for (j = 1; j <= 3; j++)
        {
            printf("%3d", a[i - 1][j - 1]);
            if (j % 3 == 0)      //当满足每行三个数时就换行 
                printf("\n");
        }
    }
    getchar();
}

对二维数组的冒泡还是没解决,二维转一维数组,一样的写法我打印的就是不一样,今天不宜做这个,下次在弄;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值