码迷,mamicode.com
首页 > 编程语言 > 详细

排序算法

时间:2015-02-12 20:05:02      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

直观的视频http://www.cnblogs.com/wangfupeng1988/archive/2011/12/26/2302216.html

1,冒泡排序

——冒泡,每一次最大的值升到最后面,像水泡升到了水面,冒出来了,不再位于水里,不再需要比较,它已经确定了,独立了。

每次从最前面开始比较相邻的两个数,如果前面的大于后面的则交换,直到末尾最后两个,结束后末尾为最大的数。

除去已经找到的最大数,继续从最前开始,两相邻数比较,直到此次数值序列的末尾。

重复以上过程,直到最后一次只有两个数值需要比较。

//the first circle , from  0,1 to ,count-2,cout-1
//the last circle, at 0,1

对每一次的数值序列,记录其是否发生了交换,如果没有,则不需要再进行下一次的循环。

void exchange(uchar * a, uchar *b)
{
    uchar temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
void sort (uchar a[], uchar Count)
{
    uchar i,j;
    bool change = 0;
    
    if(a == NULL || Count <=0 )
    return;
    //the first circle , from  0-1 to ,count-2,cout-1
    //the last circle, at 0-1
    for(j = Count-1; j>= 1,change != 0;  j-- )  //set the end posittion
    {
        change = 0;
        for(i = 0; i <= j-1; i++ )
        {
            if(a[i] > a[j])
            {
                exchange( &a[i], &a[j]);
                change = 1;
            }                
        }
    }
}

2,插入排序

--和冒泡排序逻辑伤相反,冒泡是一次找一个最大值,是个体优先,插入呢,是保证我的序列始终是整齐的,每次放入一个数值到我的序列中。

第一次整齐的序列只有1个数,把相邻的下一个数与这个数相比较,放入合适的位置

下一次,对于排好的序列,再加入下一个数,从序列末尾开始向前依次进行比较,遇到比它大得则交换,遇到比它小的,停止这一次的比较。

重复以上过程,直到最后一次插入最后一个数。

//first circle 1,0
//last circle n-1,n-2, to max, n-1,0

//想到初中时的推理证明题,证明无穷大的情况,从1开始证明, 然后证明n时成立,推导出无穷大时成立。

void sortInsert (uchar a[], uchar n)
{
    uchar i,j;
    //first circle 1,0
    //last circle n-1,n-2, to max, 1,0

    for(j = 1; j<= n-1; j++)
    {
        for(i = j-1; i >= 0; i--)
        {
            if(a[i] > a[i+1])
                exchange(&a[i], &a[i+1]);
            else
            break;
        }
    }
}

3,

 

排序算法

标签:

原文地址:http://www.cnblogs.com/aprilapril/p/4288816.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!