一些代码 for remember

这是考虑到避免内存重叠的memcpy,如有不足还请多多指点!

void *memcpy(void *dest, const void *src, size_t count)
{
char *d;
const char *s;

if (dest > (src+size)) || (dest < src))
{
d = (char *)dest;
s = (char *)src;

while(count--)
{
*d++ = *s++;        
}

else
{
d = (char *)(dest + count - 1); 
s = (char *)(src + count -1);

while(count --)
*d-- = *s--;
}

return dest;
}


void sort(int *a, int left, int right)
{
    if(left >= right)/*一个数都没用还需要排序?,递归结束条件*/
    {
        return ;
    }

    int i = left;
    int j = right;

    int key = a[i];//挖i坑

    while(i < j) /*用基准数划分分区循环*/                             
    {

        while(i < j && key <= a[j])

        /*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升
        序还是降序)2,i==j*/ 

        {
            j--;/*向前寻找*/
        }

        a[i] = a[j];//填i坑,挖出j坑

        /*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是
        a[left],那么就是给key)*/

        while(i < j && key >= a[i])


        /*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,
        因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/

        {
            i++;
        }        

        a[j] = a[i];//填j坑,挖出i坑

    }
     

    a[i] = key;/*基准数放到正确位置*/

    sort(a, left, i - 1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/

    sort(a, i + 1, right);/*用同样的方式对分出来的右边的小组进行同上的做法*/
                       /*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/

}

猜你喜欢

转载自blog.csdn.net/weixin_42155195/article/details/81070815