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

常用排序算法总结

时间:2015-08-10 23:39:48      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

1.冒泡排序

要说冒泡应该是非常简单的一种排序了,思路就如其名,数据像是泡泡一样逐个上升。

/*
 * 冒泡排序
 */
void bubbleSort(int *array , int length)
{
    //设置flag来标示是否已经有序,用于优化冒泡排序
    int flag;
    //共执行n-1趟
    for(int i = 0 ; i < length - 1; i++)
    {
        //默认为已经有序
        flag = 0;
        //从最后一个元素开始判断,因为每一趟都会排好一个元素,所以每一趟都会少比较一次
        for(int j = length - 1 ; j > i ; j--)
        {
            //比较是否比前面的元素小
            if(array[j-1] > array[j])
            {
                //如果小就交换位置并且标示为非有序数组
                swip(&array[j-1], &array[j]);
                flag = 1;
            }
        }
        //如果已经默认有序就不在进行
        if(!flag)
            break;
    }
}

这里说一下标示flag,如果已经有序比如1、2、3、4、5、6数组,但是内层循环依然会执行,只是不交换元素而已。当执行到没有元素交换的时候也就说明该数组已经有序了,这时就可以退出循环。

 

2.简单选择排序

简单选择排序就是先找当前位置为最小,判断后面是否有比当前元素小的,如果存在就和当前元素交换位置。相比冒泡排序简单选择的比较次数较多而交换最多就n-1次。

/*
 * 简单选择排序
 */
void selectSort(int *array, int length)
{
    //和冒泡排序一样,也是执行n-1次
    for(int i = 0 ; i < length-1 ; i++)
    {
        //猜测当前位置为最小元素
        int min = i;
        //执行n-i-1次,用于找到最小的元素
        for(int j = i+1 ; j < length ;j++)
        {
            //如果当前元素比min位置小,那么当前位置为min
            if(array[min] > array[j])
                min = j;
        }
        //如果min的位置发生变化,即当前位置不是min,那么交换位置
        if(min != i)
            swip(&array[min], &array[i]);
    }
}

 

3. 直接插入排序

直接插入排序思路也很简单,就不多说了。

/*
 * 直接插入排序
 */
void insertSort(int *array ,int length)
{
    //有几个元素就执行几次,默认最少两个元素,从第二个元素开始
    for(int i = 1 ; i < length ; i++)
    {
        //如果当前位置比前一位置元素小
        if(array[i] < array[i-1])
        {
            //保存当前元素
            int temp = array[i];
            int j;
            //当前元素前面的所有比当前元素大的元素全部后移一位
            for(j = i-1 ; array[j] > temp && j >= 0; j--)
            {
                array[j+1] = array[j];
            }
            //把空出来的位置赋上保存的元素
            array[j+1] = temp;
        }
    }
}

 

4.希尔排序

希尔排序就是直接插入排序的一个升级,让序列先相对有序,然后在不断减小间隔重新分组使整个有序。

/*
 * 希尔排序
 */
void shellSort(int *array ,int length)
{
    //设置希尔排序的间隔(每次/2)
    int increment = length/2;
    //当间隔变为0时结束
    while(increment >= 1)
    {
        //从第一个间隔位置开始,到最后,分好组对每一组进行直接插入排序
        for(int i = increment ; i < length ; i++)
        {
            //和直接插入排序相同,只是间隔从直接插入的1变为了increment
            if(array[i] < array[i-increment])
            {
                int j;
                int temp = array[i];
                for(j = i - increment ; array[j] > temp && j >= 0 ; j -= increment)
                {
                    array[j+increment] = array[j];
                }
                array[j+increment] = temp;
            }
        }
        //更新间隔
        increment /= 2;
    }
}

 

常用排序算法总结

标签:

原文地址:http://www.cnblogs.com/madpanda/p/4719432.html

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