蛮力法——排序问题

蛮力法——排序问题

蛮力法就是暴力法,指基于问题所描述的内容直接建立算法求解。

问题:给定一个可排序的n个元素序列(数字、字符 或字符串),对它们按照非降序方式重新排列。

扫描排序

扫描排序的基本思想:

  1. 从左到右遍历序列
  2. 找到最小的数字,和序列的首个位置交换,然后将序列的首个位置移出序列
  3. 重复直到完成排序

代码实现:

//用选择法对给定数组排序
//输入:一个可排序数组A[0..n-1]
//输出:升序排序的数组A[0..n-1]
void selectSort(int *a,int n){
    for(int i = 0;i < n-1;i++){
        int min = 0x3f3f3f;
        int min_pos = -1;
        for(int j = i;j < n;j++){
            if(a[j]<min){
                min = a[j];
                min_pos = j;
            }
        }
        swap(a[i],a[min_pos]);
    }
}

复杂度分析:

输入规模:序列元素个数n

基本操作:比较次数a[j] < min

影响基本操作执行次数的因素:n,只依赖输入规模

非递归,累加求和的时间复杂度为O(n2)

冒泡排序

冒泡排序的基本思想:

  1. 选定序列首个位置的元素作为本次排序的对象
  2. 依次和该对象所在位置后面的元素做比较,若比其大则取代其位置(换位置),若比其小,则其作为新的本次排序的对象
  3. 直到序列最后一个位置的元素也被比较了,结束此次排序,将最后一个元素移出序列
  4. 重复123至序列长度为1

代码实现:

//用冒泡法对给定数组排序
//输入:一个可排序数组A[0..n-1]
//输出:升序排序的数组A[0..n-1]
void bubbleSort(int *a,int n){
  while(n--)
    for(int i = 0;i < n;i++)
      if(a[i]>a[i+1])
        swap(a[i],a[i+1]);
}

复杂度分析:

输入规模:序列元素个数n

基本操作:比较次数a[i]>a[i+1]

影响基本操作执行次数的因素:n,只依赖于输入规模

非递归,累加求和的时间复杂度为O(n2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值