菜鸟的算法日常

来源:互联网 发布:淘宝店铺首页怎么设置 编辑:程序博客网 时间:2024/05/17 02:32

1、快速排序

方法:选择数组中的一个数,将数组中比它小的数放在它的左边,数组中比它大的数放在它的右边,然后递归(而这样的方法有很多,这里仅是总体思想)

举个栗子:挖坑填坑法(这名字绝逼不是我取的)

先上代码:

int a[10];

void sort_(int m,int n)

{

if(m>=n) return;

//递归条件。注意这里的>=是因为若所取的数为a[m]时,递归则会去取mm-1为范围

    int i=m, j=n,t;

    t = a[i];

    while (i != j)

    {

        for (;a[j] > t&&j>i;j--);

        a[i] = a[j];

        if(i!=j)

        {

            for (;a[i] <= t&&i<j;i++);

            a[j] = a[i];

        }

    }

    a[i] = t;

sort_(m, i-1);

//递归的取值范围必须是所取数的下标+1/-1到最大/最小,否则会死循环

    sort_(i+1, n);

}//本快排由律爷特约修改播出

 

2、归并排序

方法:(其实是分治法的具体体现)先将数组近乎平等地分成两份,两份各自分别排序,再将左右两数组的元素从第一个开始比较,小的则取出存进新数组,大的继续和另一个数组的下一个元素比较,最后将新数组复制到原数组,递归完成。

直接上代码:

int A[10],T[10];//在自定义函数里的定义数组容易出现未知错误,所以尽量开全局数组

void merge_sort(int A[], int x,int y,int T[])

{

if (y - x > 1)

{

int m = x + (y - x) / 2;

//相比与(x+y)/2,这里的优势在于向0取整,即正数时两式相同,负数时(x+y)/2会向小 的一方取整

int p = x, q = m, i = x;

merge_sort(Ax, m, T);

merge_sort(A, m, yT);

while (p < m || q < y)

{

if (q >= y || (p < m&&A[p] <= A[q]))

//后面一个条件不可省略其中的p<m,否则即使一个数组的数已经比较完毕,依然会 在新书组中存入已比较完毕的数组的最后一个元素

T[i++] = A[p++];

else

//((q<y && A[p]>A[q]) || p>=m)

T[i++] = A[q++];

}

 

for (i = x;i < y;i++)

A[i] = T[i];

  }

}

//至于两种算法对于相同数组元素的排序的影响应该不大,没二分查找那么麻烦

0 0
原创粉丝点击