快速排序与冒泡排序

快速排序是比较基础的排序算法,是冒泡排序的升级版,容易和冒泡排序混淆。

基本的操作还是交换,是从两头向中间遍历,同时也用到了分治的思想,每组操作都有至少一个到达最终位置

为了以防以后忘了,我在这附上具体操作图


#include<cstdio>
#include<cstring>
using namespace std;

void ksort(int *a, int left, int right)
{
    for(int x=left; x<=right; x++)
    {
        printf("%d ",a[x]);
    }printf("\n");

    if(left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
    {
        return ;
    }
    int i = left;
    int j = right;
    int key = a[left];//先把左值存在key中

    while(i < j)
    {
        while(i<j&&key<=a[j])
        {
            j--;/*向前寻找*/
        }
        a[i] = a[j];//找到右边有小于左边的,给左边赋值
        while(i<j&&key>=a[i])//再移动->左边的i,知道发现比右边大的,给右边赋值
        {
            i++;
        }
        a[j] = a[i];
    }

    a[i] = key;//最后把key里值赋给位置i
    ksort(a, left, i - 1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/
    ksort(a, i + 1, right);/*用同样的方式对分出来的右边的小组进行同上的做法*/
    /*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/
}

void mpsort(int *arr, int len)
{
    int i, j;
    int temp;
    for (i = 0; i < len-1; i++)
        for (j = 0; j < len-1-i; j++)
            if (arr[j] > arr[j + 1])
            {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
}

int main()
{
    int i;
    int a[10]= {5,3,7,1,14,8,9,2,13,6};
    int b[10]= {5,3,7,1,14,8,9,2,13,6};
    ksort(a,0,9);
    mpsort(b,10);
    for(i=0; i<10; i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
    for(i=0; i<10; i++)
    {
        printf("%d ",b[i]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/dt_zhangshuo/article/details/79583749