数据结构07:选择排序

选择排序:每次从待排序列中找出一个最小值放在已排序序列的末尾位置。改进:每次从待排序列中找出一个最小值和一个最大值,最小值放在已排序序列末尾位置,最大值放在待排序序列末尾位置,并将这个位置指定为已排序位置

普通选择排序

void selectSort(int num, elementType *a) {
    /*普通选择排序(升序)*/
    int begin = 0;
    int end = num - 1;
    int minIndex = 0;
    while (begin <= end) {
        for (int i = begin; i <= end; i++) {
            if (*(a + i) < *(a + minIndex)) {
                minIndex = i;
            }
        }
        swap(a + begin,a + minIndex);
        begin++;
        minIndex = begin;
    }
}

改进选择排序

void selectSort_new(int num, elementType *a) {
    /*改进选择排序(升序)*/
    int begin = 0;
    int end = num - 1;
    int maxIndex = 0;
    int minIndex = 0;
    while (begin <= end) {
        for (int i = begin; i <= end; i++) {
            if (*(a + i) > *(a + maxIndex)) {
                maxIndex = i;
            }
            if (*(a + i) < *(a + minIndex)) {
                minIndex = i;
            }
        }
        swap(a + begin,a + minIndex);
        if(begin  == maxIndex){
            /*如果最大值在begin位置,则最大值元素会被换到最小值的位置*/
            maxIndex = minIndex;
        }
        swap(a + end,a + maxIndex);
        begin++;
        end--;
        minIndex = begin;
        maxIndex = begin;
    }
}

代码测试

/*选择排序:每次从待排序列中找出一个最小值放在已排序序列的末尾位置。
 * 改进:每次从待排序列中找出一个最小值和一个最大值,最小值放在已排序序列末尾位置,
 * 最大值放在待排序序列末尾位置,并将这个位置指定为已排序位置*/

void swap(elementType *a, elementType *b) {
    /*交换ab的值*/
    elementType temp = *a;
    *a = *b;
    *b = temp;
}

void selectSort(int num, elementType *a) {
    /*普通选择排序(升序)*/
    int begin = 0;
    int end = num - 1;
    int minIndex = 0;
    while (begin <= end) {
        for (int i = begin; i <= end; i++) {
            if (*(a + i) < *(a + minIndex)) {
                minIndex = i;
            }
        }
        swap(a + begin,a + minIndex);
        begin++;
        minIndex = begin;
    }
}

void selectSort_new(int num, elementType *a) {
    /*改进选择排序(升序)*/
    int begin = 0;
    int end = num - 1;
    int maxIndex = 0;
    int minIndex = 0;
    while (begin <= end) {
        for (int i = begin; i <= end; i++) {
            if (*(a + i) > *(a + maxIndex)) {
                maxIndex = i;
            }
            if (*(a + i) < *(a + minIndex)) {
                minIndex = i;
            }
        }
        swap(a + begin,a + minIndex);
        if(begin  == maxIndex){
            /*如果最大值在begin位置,则最大值元素会被换到最小值的位置*/
            maxIndex = minIndex;
        }
        swap(a + end,a + maxIndex);
        begin++;
        end--;
        minIndex = begin;
        maxIndex = begin;
    }
}
void Print(elementType *a, int n) {
    for (int i = 0; i < n; i++) {
        printf("%.5f\t",*(a + i));
    }
}
void test_select(int num, elementType *a) {
    std::cout << "\n普通选择排序(升序):\n";
    selectSort(num, a);
    Print(a,num);
    std::cout << "\n改进选择排序(升序):\n";
    selectSort_new(num, a);
    Print(a,num);
}

测试结果

普通选择排序(升序):
0.235000        1.230000        1.240000        1.890000        3.141593        55.000000
改进选择排序(升序):
0.235000        1.230000        1.240000        1.890000        3.141593        55.000000
进程已结束,退出代码为 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值