数据结构的学习中,各种排序方法的介绍是学习要掌握的必备知识,边学习边记笔记的过程,我尽量少写点错误的代码,尽量把每种排序方法实现一遍,同时里面涉及到基础的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;
}