【算法】算法·冒泡,选择,插入排序算法

简介:

小续

   算法只是一种思想,在很大程度上,其实现都依赖于数据结构,所以这里提取出一些典型的算法和数据结构,包括排序以及链表/堆栈/队列等结构的操作

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


冒泡法排序

   数组中有N个整数,用冒泡法将他们从小到大(或从大到小)排序。

  实例解析:

   排序是非常重要且很常用的一种操作,有冒泡排序、选择排序、插入排序、希尔排序、快速排序、堆排序等多种方法。这里我们先简单介绍前三种排序算法和代码的实现,其余算法将在后续课程《数据结构》中学习到。

   冒泡法排序是C语言教材中已经介绍过的排序方法,与其他排序方法比较起来,冒泡法效率是最低的,但因其算法简单,故也常被采用,其算法是:

   (1)从第一个数开始,相邻两个数两两比较,将大的(或小的)交换到后面,然后继续比较第2、3个数…..当比较完最后两个数的时候,最大数(或最小数)便排在最后了。此过程称为“一趟”。

   (2)将最大数排除在外,其余数重复步骤1。

   (3)重复步骤2,直到所有数都排好为止。

   对于有N个数的排序,上面的过程总共需要进行N-1趟。

   下面是冒泡法排序的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#define  N 10
int  main()
{
     int   a[N] = {3,5,2,9,7,4,8,1,0,6}, i, j, t;
     for (i = 0; i < N-1; i++)
     {      //共进行N-1趟
         for (j = 0; j < N–i-1; j++)   /*已排好的数据不参与比较 */
             if (a[j] > a[j+1])
             {
                 t = a[j];
            a[j] = a[j+1];
            a[j+1] = t;
             }
     }
     for (i = 0; i <= N-1; i++)
         printf (“%3d”, a[i]);
     printf (“\n”);
     getch();
     return  0;
}





选择法排序

   数组中有N个整数,用选择法将他们从小到大排序。

  实例解析:

   选择法是被较多采用的一种排序方法,其效率比冒泡法高(交换数据的次数少),而算法却并未复杂多少。

   选择法排序总的思路是:

   1、找出一个最小数,交换到最前面。

   2、在剩下的数里面,再找一个最小的,交换到剩下数的最前面

   3、重复步骤2 ,直到所有数都已排好。

   显然,对于含有N个数的数组来说,其过程也要进行N-1趟 ( 0 <= i < N-1 )。

   上面所述步骤中,“找出一个最小数,交换到最前面”的方法是:

   先将剩下数中的第一个数(序号是i)作为擂主,用变量k记下其序号,后面的数依次与擂主(注意:擂主是a[k],不总是a[i])比较,若比擂主还小,则用k记下其序号(注意:此时不要交换),当所有数都与擂主比较后,k中存放的就是最小数的序号,然后将它交换到最前面(现在才交换)。在上面的过程中,数据只交换了一次,即每趟只交换一次数据。

   代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#define  N 10
int  main()
{
     int   a[N] = {3,5,2,9,7,4,8,1,0,6}, i, j, k, t;
     for (i = 0; i < N-1; i++)
     {           //共进行N-1趟
         /* 首先将最前面数当作擂主,记录其序号 */
         k = i;                     //当进行第i趟时,最前面数的序号是i
         /* 后面的每一个数都与擂主进行比较,以便找出最小数 */
         for (j = i+1; j <= N-1; j++)
             if (a[j] < a[k])           //擂主是a[k],未必总是a[i]
                 k = j;                   //若比擂主还小,则记录其序号
         /* 将最小数交换到(剩下数的)最前面 */
         t = a[k];
         a[k] = a[i];
         a[i] = t;  
     }
     for (i = 0; i <= N-1; i++)
         printf (“%3d”, a[i] );
     printf (“\n”);
     getch();
     return  0;
}





插入排序

   数组中有N个整数,用插入排序实现他们由小到大的排列。

  实例解析:

   插入排序也是常用的一种排序方法,效率较冒泡法高(一趟即可完成),但比选择法低(移动数据次数多)。其基本思想是:将数组分成两个区:前面是已排序的区域(有序区),后面是没有排序的区域(无序区)。每次都从无序区中取第一个数插入到有序区中适当位置,直到所有数据插入完毕为止。

   算法的具体描述是:

   待排序的数据存放在数组A[0, 1, ...N-1]中,未排序前,A[0]自己是一个有序区,A[1, 2, ...N-1]是无序区。程序必须从i = 1开始,直到i = N-1为止,每次将A[i]插入到有序区中。

   插入排序与打扑克摸牌时的理牌过程很相似,当摸来第一张牌时,不需要排序,本身就是排好的(就一张),从第二张开始,每次摸来一张牌,必须插入到原来有序的扑克牌中的适当位置,而为了找到这个适当位置,需要将新摸来的牌与手中的牌进行比较。

   基本的插入排序:

   首先在有序区A[0,1,...i-1]中查找A[i]应该插入的位置k(0 <= k <= i-1),然后将A[k,k+1,...i-1]中的数据各自后移一个位置,腾出位置k插入A[i]。

   若有序区所有数据均小于A[i]时,A[i]就应该在原位置不变,不需要插入。

   改进后的插入排序:

   将待插入的数据A[i]自右至左依次与有序区的数据A[i-1,i-2,...0]进行比较,若A[i]小于某数据A[j],则A[j]后移一个位置,继续与前面的数据比较......直到遇到比A[i]小的数据或前面已没有数据,则插入位置确定。

   若碰到一个数据A[j]比A[i]小,则A[i]应插入到位置j+1。

   若A[i-1]比A[i]小,则A[i]位置不变。

   若所有数据都比A[i]大,则A[i]应插入到位置0。

   下面是改进后插入排序的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define  N 10
#include <stdio.h>
int  main()
{
     int   a[N] = {3,5,2,9,7,4,8,1,0,6}, i, j, t;
     for (i = 1; i <= N-1; i++)
     {
         t = a[i];                      //保存a[i],因a[i]会被覆盖
         for (j = i-1; a[j]>t && j>=0; j--)  // a[j]>t不能写成a[j]> a[i]
             a[j+1] = a[j];
         a[j+1] = t;
     }
     for (i = 0; i <= N-1; i++)
         printf (“%3d”, a[i] );
     printf (“\n”);
     getch();
     return  0;
}




本文转自infohacker 51CTO博客,原文链接:http://blog.51cto.com/liucw/1171352


相关文章
|
4天前
|
算法 前端开发 搜索推荐
前端算法之插入排序
前端算法之插入排序
8 0
|
13天前
|
搜索推荐 算法 Java
sort-05-insert sort 插入排序算法详解
这是一个关于排序算法的系列文章总结,包括冒泡排序、快速排序、选择排序、堆排序、插入排序等10种排序算法的详细讲解和Java实现。插入排序是一种简单直观的排序算法,通过构建有序序列并逐个插入新元素来排序。提供的Java代码展示了插入排序的实现过程,并附有测试示例。所有算法已开源在GitHub项目[https://github.com/houbb/sort](https://github.com/houbb/sort)中。
|
23天前
|
人工智能 算法 搜索推荐
直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序——“数据结构与算法”
直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序——“数据结构与算法”
|
29天前
|
人工智能 搜索推荐 Shell
【排序算法】插入排序与希尔排序,你不想知道为什么希尔比插入更快吗?
【排序算法】插入排序与希尔排序,你不想知道为什么希尔比插入更快吗?
|
1月前
|
搜索推荐 算法 Shell
【数据结构与算法】直接插入排序和希尔排序
【数据结构与算法】直接插入排序和希尔排序
|
1月前
|
机器学习/深度学习 搜索推荐 算法
【排序算法】插入排序与选择排序详解
【排序算法】插入排序与选择排序详解
|
2月前
|
存储 算法 搜索推荐
【数据结构与算法】:插入排序与希尔排序
欢迎大家来到初阶数据结构的最后一小节:排序
【数据结构与算法】:插入排序与希尔排序
|
2月前
|
存储 算法 搜索推荐
【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)(含可视化算法动图,清晰易懂,零基础入门)
【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)(含可视化算法动图,清晰易懂,零基础入门)
|
2月前
|
算法 搜索推荐 Java
数据结构与算法(Java篇)笔记--插入排序
数据结构与算法(Java篇)笔记--插入排序
|
2月前
|
搜索推荐 JavaScript
NodeJS实现插入排序算法
NodeJS实现插入排序算法
14 1