选择排序

#include <stdio.h>

int count = 0;

void swap(int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
    count++;
}

void bubble(int *array, int n)
{
    int i;
    int j;
    for(i = 0; i< n; i++)
    {
        for(j = 1; j < n - i; j++)
        {
            if (array[j - 1] > array[j])
            {
                swap(&array[j - 1], &array[j]);
            }
        }
    }
}

int minkey(int *array, int low, int high)//查找指定范围内的最小值
//第一个参数是一个数组,第二个参数是数组的开始下标,第三个参数是数组的终止下标
//返回值是最小元素的下标
{
    int min = low;
    int key = array[low];//在没有查找最小元素之前,第一个元素是最小的
    int i;
    for(i = low + 1; i < high; i++)
    {
        if ( key > array[i])
        {
            key = array[i];
            count++;
            min = i;
        }
    }
    return min;
}

void select(int *array, int n)//选择排序法
{
    int i;
    for(i = 0; i < n; i++)
    {
        int j = minkey(array, i, n);
        if (i != j)//范围内的第一个成员不是最小的
        {
            swap(&array[i], &array[j]);
        }
    }
}




void print(int *array, int n)
{
    int i;
    for(i = 0; i < n; i++)
    {
        printf("%d\n", array[i]);
    }
}

int seq(int *array, int low, int high, int key)//顺序查找
//在指定范围内寻找和key相同的值,找到返回下标,找不到返回-1
{
    int i;
    for(i = low; i < high; i++)
    {
        count++;
        if (array[i] == key)
            return i;
    }
    return -1;
}

int bin(int *array, int low, int high, int key)
{
    while(low <= high)
    {
        int mid = (low + high) / 2;
        if (key == array[mid])//中间切一刀,正好和要查找的数相等
            return mid;
        else if (key > array[mid])//如果要找的数大于array[mid],那么就在下半部分继续切刀
            low = mid + 1;
        else//如果要找的数小于array[mid],那么就在上半部分继续切刀
            high = mid - 1;

    }
    return -1;//没有找到数据
}

int bin_rec(int *array, int low, int high, int key)
{
    if (low <= high)//递归终止条件
    {
        int mid = (low + high) / 2;
        if (key == array[mid])
            return mid;
        else if (key > array[mid])
            return bin_rec(array, mid +1, high, key);//在下半部分查找
        else
            return bin_rec(array, low, mid - 1, key);//在上半部分查找
    }else
        return -1;
}

int main(void)
{
    int array[10] = {32,45,76,21,56,85,23,89,15,49};
    //int array[10] = {10, 9,8,7,6,5,4,3,2,1};
    //int array[10] = {1,2,3,4,5,6,7,8,9,10};
    //bubble(array, 10);
    //select(array, 10);

    //printf("%d\n", seq(array, 0, 10, 32));


    printf("%d\n", bin_rec(array, 0, 10, 76));
    printf("-----------------------\n");
    print(array, 10);

    printf("count = %d\n", count);
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值