数据结构学习8——冒泡排序

数据结构的学习中,各种排序方法的介绍是学习要掌握的必备知识,边学习边记笔记的过程,我尽量少写点错误的代码,尽量把每种排序方法实现一遍,同时里面涉及到基础的C语言知识,也会在C语言板块加以总结,尽量让我这个或者其他的初学者都能学的更轻松一点。

冒泡排序基本思路:其实就是一种交换排序,两两比较相邻的关键字,如果反序则交换,直到没有反序为止。

冒泡排序初级版:基本思路就是交换排序,让每一个关键字,都和它后面的每个关键字比较,如果大则交换,这样第一位置的关键字在一次循环后一定变成最小值。






代码实现如下:









冒泡排序:

上面的初级版冒泡排序其实就是一个交换排序,那下面给出“正宗的冒泡排序”;

下面给出冒泡排序的一个实现代码(因为给出的是具体的例子,这个具体的例子可以变化无穷,各种改版成自己需要的)





分析:着重看排序部分,我们分成两点来分析:

问题一:上述的代码中可以看出,for循环中有for(i)部分和for(j)部分,具体的工作是什么?

for(i)在这里其实是为了"引导作用":

for(j)是为了比较,交换也是为了比较用的。

问题二:冒泡的实质是什么?

每一次进行冒泡排序时,就是把最小的值冒泡到最顶端,通过i次冒泡就可以完成具体的排序工作。



面试中冒泡排序考什么?

案列1:请用C/C++写出一个冒泡排序程序,要求输入10个整数,输出排序结果。

这个就显得很简单了,我们上面不是给定的一些列的数据吗?那我们把它改成空数组,然后输入数据不就可以了吗?





冒泡排序优化:


其实对于大多数乱序的情况下,非交换排序的冒泡排序(其实就是冒泡排序啊,就是正宗的冒泡排序)而言,冒泡排序的效率已经比较高了,但是还有另外一种情况,就是一组数据中,只有两个数据需要进行交换,等二者交换完毕后,就是一个正常的序列了,那如果还是想冒泡排序那么进行运算的话,其实是挺浪费的。对于这种情况,我们该如何进行解决?此时增加一个变量,就是标志位,通过标识来判断,何时排序已经完成。减少了运算量。





案列2:给定一个数组input[],如果数组长度n为奇数,则将数组中最大的那个数放到output[]的最中间位置去,如果数组长度n为偶数,则将数组中最大的那个数放到output[]的中间偏右的那个位置,然后再按照从大到小顺序,依次在第一个位置的两边,按照一左一右的顺序。

例如:intput[]={3,6,1,9,7},output[]={3,7,9,6,1};

intput[]={3,6,1,9,7,8},output[]={1,6,8,9,7,3};

函数接口:void sort(int input[],n,output[])

分析:这其实就是一个冒泡排序的问题,解题的思路是:首先通过冒泡排序,按照从大到小的顺序排列好;

再按照排列好的结果,把input中的第一个数给output

接着:按照1、2的顺序分别给mid的左右

即可完成排列。

排序部分:

void bubblesort(int data[],int n)
{
int temp=0;
for(int i=0;i<n;i++)
{
    for(int j=i+1;j<n;j++){
       {
          if(data[i]<data[j])
           {
              temp=a[j];
              a[j]=a[i];
              a[i]=temp;
            }
           }
          }
     }

数组交换部分
void sort(int input[],int n,int output[])
{
int *sort_input = new int[n];
for(int i=0;i<n;i++)
{
sort_input[i]=input[i];
}
bubblesort(sort_input,n);
/***判断数组长度的奇偶****/
if(1==n%2)
{
int mid=n/2;
int k=0;
output[mid]=sort_input[k++];
for(int j=1;j<=n/2;j++)
{
output[mid-j]=sort_input[k++];
output[mid+j]=sort_input[k++];
}
else
{
int mid=n/2;
int k=0;
output[mid]=sort_input[k++];
for(j=1;j<n/2;j++)
{
output[mid-j]=sort_input[k++];
output[mid+j]=sort_input[k++];
}
output[0]=sort_input[k++];
}
delete sort_input;
}






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值