C语言几种常见排序算法(一)

1.冒泡排序
思路:
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
对于包含n个元素的数组,需要进行n-1次操作:每操作一次,会找出一个较大元素往后移动。

而对于这n-1次操作,每次需要进行n-1-i次排序。

/*******************************************************

void bubble_sort(int *array, int len)
{
    int i, j, tmp;

    for(i = 0; i < len - 1; i++)        //需要进行len - 1次操作。
    {
        for (j = 0; j < len - 1 -i; j++)   
        {
            if (array[j] > array[j+1])
            {
                tmp = array[j+1];
                array[j+1] = array[j];
                array[j] = tmp;
            }
        }
    }
  
}

********************************************************/
2.插入排序:
思路:
将数组看作两部分,一部分为已经排好序的,另一部分为待排序的,每次从待排序的序列中拿出一个去和前面已排序的部分逐一进行比较找出适当的位置插入并保证此部分仍然有序。
一般将数组第一个元素看做已经排序的,所以对于包含n个元素的数组来说,需要进行n-1次操作。
而每次操作需要拿待排序的元素和见面已经排序的元素依次比较。

/**********************************************************

void insert_sort(int *array, int len)
{
    int i, j, tmp;
    for (i = 1; i < len; i++)
    {
        tmp = array[i];
        for (j = i; j > 0 && tmp <  array[j-1]; j--)
            array[j] = array[j-1];
        array[j] = tmp;
    }
}

***********************************************************/

3.快速排序
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
该方法的基本思想是:

1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。

/*************************************************************************************

int adjust_array(int a[], int l, int r)
{
    int pivot = a[l];

    while (l < r)
    {
        while (l < r && a[r] >= pivot)
            r--;
        a[l] = a[r];

        while (l < r && a[l] <= pivot)
            l++;
        a[r] = a[l];
    }

    a[l] = pivot;

    return l;
}

void __quick_sort(int a[], int l, int r)

{
    int pivotloc;
    if (l >= r)
        return;

    pivotloc = adjust_array(a, l, r); 
    __quick_sort(a, l , pivotloc);
    __quick_sort(a, pivotloc + 1, r);
}

*******************************************************/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值