码迷,mamicode.com
首页 > 编程语言 > 详细

经典排序:冒泡排序+选择排序 小结

时间:2018-01-14 01:02:20      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:排序   col   就是   log   lan   大小   turn   第一个   post   

经典排序:冒泡排序+选择排序

FJUTOJ 1842

冒泡排序

原理是取相邻两个数进行大小比较,判断是否交换。

以从小到大排序为例,冒泡排序就像气泡一样,最小的数慢慢浮上来,最大的数慢慢沉下去。那么完整从头到尾做一次之后最后一位就是原序列中最大的数字了。然后只需要对1~(n-1)个数字进行排序,完成后倒数第二个数字也为原序列的1~n-1元素中最大的值。如此重复,进行n-1次一定能完成排序。参考代码:

 1 #include <stdio.h>
 2 void BubbleSort(int *, int);
 3 int main()
 4 {
 5     int a[] = {9,5,3,6,7,2,5,4,3,9}, i;
 6     int s = sizeof(a) / sizeof(int);
 7     puts("Before sort:");
 8     for(i = 0; i < s; i++)
 9         printf("%d ",a[i]);
10     BubbleSort(a,s);
11     puts("\nAfter sort:");
12     for(i = 0; i < s; i++)
13         printf("%d ",a[i]);
14     return 0;
15 }
16 void BubbleSort(int *a, int s)
17 {
18     int i, j, tmp;
19     for(i = 0; i < s-1; i++)
20     {
21         for(j = 1; j < s-i; j++)
22         {
23             if(a[j-1] > a[j])
24             {
25                 tmp = a[j-1];
26                 a[j-1] = a[j];
27                 a[j] = tmp;
28             }
29         }
30     }
31 }

然后可以进行一个优化就是如果一整趟下来都没有一次交换,那么确定该序列已经满足单调,直接跳出循环可以省时。代码如下

 1 void BubbleSort(int *a, int s)
 2 {
 3     int i, j, tmp;
 4     char swap;
 5     for(i = 0; i < s-1; i++)
 6     {
 7         swap = 0;
 8         for(j = 1; j < s-i; j++)
 9         {
10             if(a[j-1] > a[j])
11             {
12                 swap = 1;
13                 tmp = a[j-1];
14                 a[j-1] = a[j];
15                 a[j] = tmp;
16             }
17         }
18         if(swap == 0) break;
19     }
20 }

 

选择排序

以从小到大排序为例。原理是在序列中挑一个最小的值,然后与序列中的第一个交换。那么,第一个就是整个序列中最小的数字。再对从第二个数字开始的序列做这个操作,得到剩余序列中最小的数字所在位置,与原序列第二个数交换,以此类推做n-1完成排序。参考代码:

void SelectSort(int *a, int s)
{
    int i, j, tmp, min_num_index;
    for(i = 0; i < s-1; i++)
    {
        min_num_index = i;
        for(j = i+1; j < s; j++)
        {
            if(a[j] < a[min_num_index])
                min_num_index = j;
        }
        if(min_num_index != i)
        {
            tmp = a[i];
            a[i] = a[min_num_index];
            a[min_num_index] = tmp;
        }
    }
}

 

以上代码和文字均手打,有误还请指正!

经典排序:冒泡排序+选择排序 小结

标签:排序   col   就是   log   lan   大小   turn   第一个   post   

原文地址:https://www.cnblogs.com/sandychn/p/8280817.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!