冒泡排序
-
问题描述: 给定一个长度为n一维数组An,对其进行顺序排序后输出所有元素。
-
tip: 所举样例默认为升序,冒泡排序有两种遍历方式:从前往后遍历和从后往前遍历; 这里采用从后往前排,后续解释了两种遍历方式的差异。
-
排序讲解: 最慢需要进行n-1次排序。每一次排序时,将相邻两项元素进行对比,较小的元素排前面;当某次排序没有发生位置交换时,则表示排序结束。
-
过程分析:
- 在第i次排序时,依次从An-1 开始向前进行遍历,直到遍历到**Ai**时, 结束该次遍历。
- 每次遍历中,如果Ak<Ak-1 成立时,则交换二者位置,实现较小的元素位置靠前,较大元素位置靠后。然后继续向前进行遍历;
- 进行n次排序,第i次排序中对比的元素序列为:An-1到Ai;每次遍历过程中实现当前对比序列中的最小值放置于当前序列队首,既第i次排序结束后,Ai一定为位置i以后的最小元素。
- 经过第i次排序后,A0到Ai序列一定满足升序,因为越早找出的元素,其值就越小; 在每次元素对比中,同时也实现了较大元素位置靠后。
- 从后往前进行遍历的重点在于: 每次遍历都能找到一个当前序列的较小值放置于当前序列最前方;当出现某一次遍历中不存在位置更替,则后续元素都满足升序。
- 如果想要从前往后遍历: 每次遍历的序列为A0到An - i - 1,找出当前序列中的较大值放置于当前序列最后,当不存在位置更替时,则前列元素也满足升序。
-
时间复杂度:O(n^2)
// 升序
// 从后往前进行遍历
void BubbleSort1(int [] arr,int n){
int temp;//临时变量
bool flag;//是否交换的标志
for(int i=0; i < n-1; i++){ //表示趟数,一共 l-1
// 每次遍历标志位都要先置为false,才能判断后面的元素是否发生了交换
flag = false;
for(int j = n - 1; j > i; j--){ //选出该趟排序的最大值往后移动
if(arr[j] < arr[j-1]){//排序方向
temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
flag = true; //只要有发生了交换,flag就置为true
}
}
// 判断标志位是否为false,如果为false,说明后面的元素已经有序,就直接return
if(!flag) return;
}
}
// 从前往后进行遍历
void BubbleSort1(int [] arr,int n){
int temp;//临时变量
bool flag;//是否交换的标志
for (j = 0; j < n - 1; j++)
{
flag = false;
for (i = 0; i < n - 1 - j; i++)
if (a[i] > a[i + 1])
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
flag = 1;//不是有序的,flags设置为1;
}
if (!flag) return;
}
}
视屏过程讲解:(转载网上视屏,如果有侵权麻烦大佬私信我,立马解决!!!)
https://haokan.baidu.com/v?pd=wisenatural&vid=2462905062091788627