二元选择排序

Posted 木剑配酒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二元选择排序相关的知识,希望对你有一定的参考价值。

1.目的

  这几天看别人的算法博客,发现有些人的代码存在错误。并且在搜索引擎上排名非常高,误导了很多人,所以自己写了这篇博客。

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

  2018-4-2  今天有人评论才发现自己也写错了,没有认真考虑,重新改了一下,再次验证了多次.谢谢那位兄弟及时指正. 

2.算法描述

  二元选择排序是对简单选择排序的一种改进。简单选择排序就是从数据中选择出最小的值与第一个位置的数据交换,然后在剩下的数据中选择最小的值与第二个位置的数据交换以此类推。而二元选择排序就是在每次选出数据中的最大值最小值分别和第一位和最后一位交换。所以外层循环次数就从n次变为了n/2次.

3.代码

 1 /**
 2 * time:2017年12月28日
 3 * author:Triomphe
 4 */
 5 
 6 #include <stdio.h>
 7 #include <stdlib.h>
 8 
 9 void printArray(int a[], int n);
10 
11 //二元选择排序
12 void TwoSelectSort(int a[], int n) {
13     int i, j, mintmp, maxtmp, max, min;
14 
15     for (i = 0; i<n / 2; i++) {
16         min = i, max = i;  //先将最小值与最大值下标指向未排序的第一个数。
17         for (j = i + 1; j<n - i; j++) {
18             if (a[j]<a[min]) {
19                 min = j;
20                 continue;
21             }
22             if (a[j]>a[max]) {
23                 max = j;
24             }
25         }
26         //最小值是否已经在正确的位置上了.
27         if (min != i) {
28             mintmp = a[min];
29             a[min] = a[i];
30             a[i] = mintmp;
31         }
32         //可能出现最大值存储在a[i],那么经过上一步交换,a[i]上存储的最大值已经被换到了a[min]所在位置.
33         if (max == i) {
34             max = min;
35         }
36         //最大值是否已经在正确的位置上了
37         if (max != n - i - 1) {
38             maxtmp = a[max];
39             a[max] = a[n - i - 1];
40             a[n - i - 1] = maxtmp;
41         }
42         
43         printArray(a, n);
44         printf("\\n");
45     }
46 }
47 
48 //输出数组
49 void printArray(int a[], int n) {
50     int i;
51     for (i = 0; i<n; i++) {
52         printf("%d ", a[i]);
53     }
54 }
55 
56 
57 int main()
58 {
59     //定义的数组
60     //int data[] = { 275,322,12,2,23,12,43,123,22,3,56,34,99,12,1232,3,14,45,22,22,11,44,74 };
61     int data[20];
62     for(int i=0;i<20;i++){
63         data[i] =1+(int)(rand() % 50);
64     }
65     int n = sizeof(data) / sizeof(data[0]);    //数组中数据量
66     TwoSelectSort(data, n);
67     printArray(data, n);
68     return 0;
69 }

 4.最终结果

 

以上是关于二元选择排序的主要内容,如果未能解决你的问题,请参考以下文章

简单选择排序和二元选择排序

算法二元选择排序

11.python排序算法之冒泡排序简单选择排序,二元选择排序直接插入排序

《程序员代码面试指南》第八章 数组和矩阵问题 不重复打印排序数组中相加和为给定值的所有二元组和三元组

选择排序

如何从另一个片段访问片段对象