关于数据结构三种简单的排序总结

本文介绍了数据结构中三种简单的排序算法:冒泡排序、选择排序和插入排序。冒泡排序是最直观的排序方式,通过相邻元素比较来确定值的位置。选择排序在冒泡排序基础上优化,每次外循环找出最小值与起点交换。插入排序则将无序元素逐个插入已排序部分,保持左侧有序。每种排序都有其适用场景和优劣。
摘要由CSDN通过智能技术生成

     大家都知道,对于数据结构有三种简单的排序:冒泡排序,选择排序和插入排序,说他们简单是因为他们在排序的速度相对较慢,而且排序的算法也比较简单,更适用于数据量小的文件排序中。下面我们就分别来分析一下这三种排序。

    首先来说说冒泡排序:它是这三种排序中最简单也是最为人熟悉的一种排序,它的思想是用每一次循环来固定一个值的位置。很显然,当我们有N个值的时候,我们就需要比较N-1趟,在每一趟的确定值中,我们还需要比较很多次,这个比较的次数会随着固定值的增多而减少。现在,我们以排出数组的升序为例:假如我们现在有这样的一个数组int []a={12,1,23,45,14,17},我们需要确定最后一个数的值。这个时候我们可以先定义一个变量b,然后比较a[0]和a[1]的大小,若a[0]<a[1],则a[1]继续和a[2]比较,若a[0]>a[1],则将b=a[1];

a[1]=a[0];a[1]=b;依次类推,他们都是相邻两个数的比较,而且到最后两个数比较时,总有一个数是最大值,这样我们就找出了最大值。在第二趟的比较中,相邻两个数的比较次数自然就会减少一次,,,,这样每一趟下来就能确定所有比较数中的最大值。升序就不成问题了,话不多说,以上述例子为例,直接上核心代码吧!

for(int i=0;i<a.length-1;i++){                           //因为一共a.length个数,但只需要比较a.length-1次

   for(int j=0;j<a.length-1-i;j++){                     //每一趟就会减少i个数,且减1和上面的原因一样
     if(a[j]>a[j+1]){

       b=a[i];

       a[i]=a[i+1];

       a[i+1]=b;

     }
   }
}

   说完最简单的排序,下面我们来说说选择排序。其实,选择排序是在冒泡排序的基础上进行的改进,将冒泡排序的每比较一次就交换位置的思想调整为每外循环一次才交换一下位置,每次循环都找出最小的值,跟循环起点的交换。这样我们在比较次数不变的情况下,减少了交换的次数。代码如下:

for(int i=0;i<a.length-1;i++){

   int n,m;            //定义两个变量,一个存放临时最小值的下标,一个用以交换位置是使用

    for(int j=0;j<a.length-i-1;j++){

           if(a[j]>a[j+1]){

               n=j;

            }

       }

     if(a[i]>a[n]){

      m=a[i];

       a[i]=a[j];

      a[j]=m;

    } 

}

   说完以上两种类似的排序,下面我们来说说比以上两种更优秀的排序吧----------插入排序。插入排序的基本思想是:在一堆数的左边是有序的,而在数的后半部分是无序,这时我们只需要将右边的数一个个的插入到左边,就可以完成排序。在这个思想中,我们运用了极限的思想,因为在排序前我们没有必要去判断左边到底到哪个数为止才是无序的,所以我们默认将第二个数开始就认为是无序的,而第一个数永远保持有序,同样我们来看一下实现的代码吧!

int m;                                       //首先定义一个要插入的位置的

for(int i=1;i<a.length-1;i++){

    int n;

    n=a[i];                                 //要插入的值

   m=i;

    while(m>0&&a[m-1]>n){

        a[m]=a[m-1];

        m--;

    }

      a[m]=n;

}

到这里三种简单的排序就算讲完了,大家可以自己体会一下,当然有什么问题,也可以提醒我








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值