常用排序算法

1. 冒泡排序

#define ARRAY_SIZE      10
s32 data[] = {8,5,3,7,0,9,1,4,6,2};

int main(int argc, char * argv[])
{
  int max,temp;
  short i,j;

  for(i=0; i<ARRAY_SIZE - 1; i++) { //外循环
    for(j=i+1; j<ARRAY_SIZE; j++) { //内循环
      if (data[j] < data[i]) {
        temp = data[i];
        data[i] = data[j];
        data[j] = temp;
      }
    } //内循环每完成一次,将会产生新一个最小元素,最终将其置于data[i] 
  }

  return 0;
}

冒泡排序是最容易理解的排序算法

定义两个概念:

        A. 比较元素:在外循环中从第i个元素(数组中第i-1个元素,data[i-1])开始,直到倒数第2个元素,依次作为比较元素。

若需要排序的数组元素有N个,则比较元素依次分别从第1个元素开始,直到第N-1个元素。若用数组表示,即从data[0]开始,直到data[N-2],通过外循环依次定义为比较元素。

        B.被比较元素: 在定义“比较元素”时,若比较元素为data[i],则剩余的data[i+1],data[i+2],......,data[N-1] 共N-i-1个元素。

外循环从第一个元素开始,依次与剩余元素比较,直到倒数第二个元素与最后一个元素比较完成

内循环每循环一轮,将会在还未排序的元素中将产生最大者或者最小者,并且将其置于data[i]。

【冒泡排序算法 :时间复杂度 O(n^2)】

 

2. 插入排序

#define ARRAY_SIZE      10
s32 data[] = {5,3,7,0,1,4,6,2,9,8};

int main(int argc, char * argv[])
{
  s32 max, temp;                                                                                                                                                                        
  u16 i,j,k;

  for(i=1; i<ARRAY_SIZE; i++) {
    temp = data[i];
    for(j=i-1; j>=0; j--) {
      if (temp > data[j])
        data[j+1] = data[j];
      else
        break;
    }
    data[j+1] = temp;
  }

  return 0;
}

    在进行第一趟插入排序时,可将第一个元素看成长度为1,已经是有序的子序列,然后将第二个元素插入到这个子序列之中。然后将第二个元素插入到这个子序列之中。以此类推,第i趟排序将序列中第i+1个元素插入到一个已经按值有序排列的子序列中的合适位置,使得插入后的序列仍然保持按值有序。

 

3. 选择排序

#define ARRAY_SIZE	10
s32 data[] = {5,3,7,0,1,4,6,2,9,8};

int main(int argc, char * argv[])
{
  s32 i,j,k;
  s32 min;
  s32 temp;

  for(i=0; i<ARRAY_SIZE; i++) {
    min = i;
    for(j=i+1; j<ARRAY_SIZE; j++) {
      if (data[j] < data[min])
        min = j;
    }

    if(min > i) {
      temp = data[i];
      data[i] = data[min];
      data[min] = temp;
    }
  }

  return 0;
}

选择排序直观的来讲,每一趟的选择排序就是从序列中未排好顺序的元素中选择一个最小的元素,该元素与这些未排好顺序的元素的第一个元素交换位置。选择排序与冒泡排序,从每循环一次的结果来看,很相似;但是选择排序只是在每次循环结束时,发生一次交换,将未排序元素中的最大或者最小元素置于合适的位置。而冒泡排序则是在元素之间进行比较时,条件成立,即会发生一次交换。

 

4. 快速排序

转载于:https://my.oschina.net/u/555653/blog/856845

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值