5种基本排序法

#include <stdio.h>   

 

--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

计数排序:                                                     

a[i]与后面的每个元素相比,若a[i]较大则Count[i]+1,否则对方+1     

--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

void rank_sort(int a[],int Count[],int s[],int n)

{

    int i,j;

    for (i = 0; i < n-1; i++)

        for (j = i+1; j < n; j++)

            if(a[i] < a[j])  Count[j]++;

            else             Count[i]++;

    for (i = 0; i < n; i++)

        s[Count[i]] = a[i];

}

 

--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

选择排序(下划线为即时终止算法应加上的部分)

找出最大元素并放到最后,剩下的找出最大者放到倒数第二的位置...

--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

Void selection_sort(int a[],int n)

{

    int i,j,pos,t,sorted=0;

    for (i = n-1; i > 0 && !sorted; i--)

    {

        pos = 0;  sorted = 1;

        for (j = 1; j <= i; j++)

            {   if(a[j] > a[pos])  pos = j;

else sorted = 0;   }

        t = a[i]; a[i] = a[pos]; a[pos] = t;

    }

}

--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

冒泡排序(下划线为即时终止算法应加上的部分)

每个元素与相邻元素比较,若靠前者较大则两者交换

--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

Void bubble_sort(int a[],int n)

{  

    int i,j,t,sorted=0;

    for (i = n-2; i >= 0 && !sorted; i--)

    {  

sorted = 1;

        for (j = 0; j <= i; j++)

            if(a[j] > a[j+1])

            {

t = a[j+1]; a[j+1] = a[j]; a[j] = t;

sorted = 0;

}

    }

}

 

--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

插入排序:

取出第i个元素,插入到前面已排好序的i-1个元素中,i1...n-1循环

--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

Void insertion_sort(int a[],int n)

{

    int i,j,t;

    for (i = 1; i < n; i++)

    {

        t = a[i];

        for (j = i-1; j >= 0 && t < a[j]; j--)

            a[j+1] = a[j];

        a[j+1] = t;

    }

}

 

--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

快速排序、查找第k个元素(在快排代码基础上加上下划线部分)

以第一个元素作为支点,在剩余元素中从左往右寻找比其大的元素,

同时从右往左寻找比其小的元素,交换两者,直到不存在可交换的元素,

把支点放到合适位置,支点左右的元素再递归排序 

--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

void quick_sort(int a[],int L,int R,int k)

{

    int i = L/*从左到右的游标*/, j = R+1/*从右到左的游标*/, temp;

    int p = a[L];  //a[L]为支点

    if (L >= R)  { printf("%d",p);  return;  }

    while(1)  //把左侧>=支点p的元素与右侧<=支点p的元素进行交换

    {  

        do {i = i + 1;} while(a[i] < p);

        do {j = j - 1;} while(a[j] > p);

        if(i >= j) break; //未发现交换对象

        temp = a[j]; a[j] = a[i]; a[i] = temp; //否则交换

    }

//结束循环时,a[j]为从左到右最后一个比支点小的元素,将其与支点交换

    a[L] = a[j]; a[j] = p;

if(j+1 == k) {printf("%d",a[j]); return;}

if(j+1 > k)  quick_sort(a,L,j-1,k);  //递归对左段排序

else         quick_sort(a,j+1,R,k);  //递归对右段排序

}

--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

void main()   //各种排序算法的调用

{

    int a[6] = {62,31,84,96,19,47};

    int Count[6],s[6],i;  for (i = 0; i < 6; i++)  Count[i] = 0;

    rank_sort(a,Count,s,6); // 计数排序,结果数组为s

    selection_sort(a,6);    // 选择排序

    bubble_sort(a,6);       // 冒泡排序

    insertion_sort(a,6);    // 插入排序

    quick_sort(a,0,5);      // 快速排序

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值