冒泡排序算法和选择排序算法,冒泡排序算法的正确理解
思考基本的N个元素,从第一个开始,依次比较相邻两对是否逆序(前大后小)。如果是逆序,交换两个元素,即第一个和第二个比,然后第二个和第三个比,然后第三个和第四个比,如果是逆序,交换两个元素,将原N元排序问题转化为n-1元排序问题。第二轮从第一轮开始,然后比较两个相邻元素是否逆序。如果顺序相反,交换这两个元素,直到n-2和n-1被比较。这样,n-1轮过后,排队就是有序排队了。
具体步骤1。读入的数据存储在数组A. 2中。比较前后两个相邻的数据,如果前面的数据大于后面的数据,就交换这两个数据。3.遍历一次数组的第0个数据到第n-1个数据后,最大的数据“冲”到数组的第N-1个位置。4.n=n-1。如果n不为0,重复前两步,否则排序完成。实现程序使用两层循环来完成算法,外循环I控制每轮比较要进行多少次。第一轮比较是n-1次,第二轮比较是n-2次,而上一轮对比是1次。内循环J控制每轮中两个相邻元素是否逆序I次,如果逆序,则交换两个元素。
代码#包含iostream
使用命名空间std
int main()
{
int n,temp,array[1000];
CIN n;
array[0]=n;
for(int I=1;I=n;我)
{
cin阵列[I];
}
for(int I=1;I n;我)
{
bool ok=true
for(int j=1;j=n-I;j)
{
if(数组[j]数组[j 1])
{
ok=假;
temp=array[j 1];
array[j 1]=array[j];
array[j]=temp;
}
}
如果(ok)破;
}
for(int I=1;I=n;我)
{
cout数组[I]“”;
}
返回0;
}测试#包含iostream
#包括cstdio
#包含cstdlib
#包括ctime
使用命名空间std
int main()
{
int n,temp,array[1000];
//CIN n;
//array[0]=n;
//for(int I=1;我我)
//{
//cin数组[I];
//}
n=1000
srand(time(NULL));
for(int I=1;I=n;我)
array[i]=rand()000;
for(int I=1;I n;我)
{
bool ok=true
for(int j=1;j=n-I;j)
{
if(数组[j]数组[j 1])
{
ok=假;
temp=array[j 1];
array[j 1]=array[j];
array[j]=temp;
}
}
如果(ok)破;
}
for(int I=1;I=n;我)
{
cout数组[I]“”;
}
cout endl
printf(所用时间=%.7lf ,(double)clock()/CLOCKS _ PER _ SEC);
返回0;
}
算法时间复杂度分析如果文件的初始状态为正序,则一次扫描即可完成排序。
所需的关键字比较次数C和记录移动次数M都达到最小值:C min=n-1,M min=0。
因此,冒泡排序的最佳时间复杂度为O(n)。
如果初始文件是逆序的,就需要n-1排序。
每次排序行程需要比较关键字n-i次(1in-1),每次比较必须移动记录三次才能到达交换记录位置。在这种情况下,比较和移动的次数达到最大值:
冒泡排序最坏的时间复杂度是O(n 2)。
综上所述,冒泡排序的总平均时间复杂度为O(n 2)。
稳定性冒泡排序的算法是将小元素向前调整或大元素向后调整。
比较是两个相邻元素之间的比较,交换也发生在这两个元素之间。
所以,如果两个元素相等,就不会再交换;如果两个相等的元素不相邻,那么即使这两个元素通过前面的两两交换相邻,此时也不会交换,所以前后相同元素的顺序没有变化,所以冒泡排序是一种稳定的排序算法。
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。