冒泡和选择排序的理解

今天,我们来说说算法里最简单的两个排序,那就是选择排序和冒泡排序,但是在这两个排序中多少还是会出现一些问题,先说说我的个人经验吧,在最开始学习C语言的时候,最先接触到的就是这两种算法,当时对C语言本来懵逼着,再别说什么算法,什么冒泡。没办法,我也就就只能记住代码的是实现,随着时间一天天的流逝,问题也就越来越明显,来说说冒泡选择的思想,为什么要这么做?以及到后来程序记混了,选择和冒泡记差了,除此之外还有一些问题,要是不理解思想,真的,再简单的代码都有可能记错,所以今天就想让大家来一起看看当时感觉巨难的排序


首先的,我们先说冒泡排序,它的思想是这样的:一组数据,首先是用一个for循环把它遍历一遍,然后再用一个循环从头开始循环,当第j和数比j+1的数大时,就交换这两个数,第一趟下来,它就得到了数列中最小的数,后面也是一样的以此类推,直到排序结束。在这里我为大家写的还是最初的代码,因为冒泡还是有很多种写法,但让大家印象最深刻的就是最简单的那种方法

void Bubble(int arr[],int len)
{
int i,j,tmp;
bool flag=0;
for( i=0;i{
for(j=0;j{
if(arr[j]>arr[j+1])
{
tmp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=tmp;
flag=1;
}
}
if(! flag)
{
break;
}
}
}

至于后面加的flag标志位,设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成

还有一种情况就是前N个数无序,但后面的数都已有序,所以说第一趟冒泡下来后面的数就不用再进行冒泡了。。

void BubbleSort3(int a[], int n)
{
int j, k;
int flag;
flag = n;
while (flag > 0)
{
k = flag;
flag = 0;
for (j = 1; j < k; j++)
{
if (a[j - 1] > a[j])
{
Swap(a[j - 1], a[j]);
flag = j;
}
}
}
}

但优化归优化,但冒泡的效率还是很低,所以数据量小的时候可以拿来用用,但当数据量大的时候,建议还是使用其他排序吧;当然差点忘了说,时间复杂度这个问题,最好的情况下当然就遍历一遍就可以了,所以最好情况下的时间复杂度是O(n),但是一般复杂度都O(n*n);哦,还有一点就是它是一种稳定的排序。




2.第二部分就是我们的选择排序

接下来我们就来数一下选择排序,选择排序的思想就是首先还是遍历一遍数组,首先把第一个数当做最小数,我们就用min存放它的下标,然后从第二个数开始往后遍历,当发现有比arr[min]小的数时,就把这个数的下标刷新min的值,

然后一趟下来,若i !=min我们就交换第i下标和min下标所对应的数组的值即可。

#include
void SelectSort(int arr[], int len)
{
int i,j;
int min;
int tmp;
for (i = 0; i < len - 1; ++i)
{
min = i;
for (j = i + 1; j < len; ++j)
{
if (arr[min] > arr[j])
{
min = j;
}
}
//if (min != i);
tmp = arr[min];
arr[min] = arr[i];
arr[i] = tmp;
}
}


说完代码我们还是要来说说它的稳定性,选择排序因为要跳着排序,所以它是一种不稳定排序,然后呢,时间复杂度o(n*n)就是n的平方。

我们今天来说的冒泡和选择可能很简单,但很容易被忽视掉它的思想,所以有的时候还是需要回头来看看他们的执行过程和其中的含义。可能有解释不清或者解释有误的,还请高人能多多指教。谢谢!

你可能感兴趣的:(数据结构,排序算法)