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

Posted SandyChen

tags:

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

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

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;
        }
    }
}

 

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

以上是关于经典排序:冒泡排序+选择排序 小结的主要内容,如果未能解决你的问题,请参考以下文章

算法小结-冒泡选择排序直接插入排序

十大经典排序算法总结(冒泡排序)

冒泡排序与选择排序(经典版)----java基础总结

九种经典排序算法详解(冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序,计数排序,桶排序,基数排序)

01. Java的经典排序--选择排序--冒泡排序--折半查找(二分查找)

十大经典排序之冒泡,选择,插入排序