首页 > 试题广场 >

请简述冒泡排序原理

[问答题]
以升序为例:
从第0个数开始,将相邻两个位置的数据进行比较,如果后面的数据小于前面的数据,则交换它们的位置,最后最大的数会放在数据的末尾。时间复杂度为O(n^2),空间复杂度为O(1)
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr.length-i-1; j++) {
				if (arr[j]>=arr[j+1]) {
					int temp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;
				}
			}
		}


发表于 2020-09-18 19:42:56 回复(1)
每个元素依次和其他元素比较大小,最值放一边.比较过的就不用比了.不用和自己比.
发表于 2020-10-28 19:43:49 回复(1)
冒泡排序就是比较相邻的两个元素,如果前面大就交换他们, 这样每次较大的数就会慢慢向后移动,就像冒泡一样
发表于 2020-11-21 21:29:54 回复(0)
abcde, 
假设以a为基准,a轮流和b 比较值的大小
如a大于b,a和b交换位置,小于 位置不变
再以b 和c做对比
就这样重复几次,知道游标为到e
发表于 2020-11-07 20:47:07 回复(0)
利用双层循环,外层遍历[0,n),下标记为i,内层遍历[0,n-i-1),下标记为j,以升序为例,内循环中每次将下标为j和j+1的元素比较,如果左边大于右边元素就交换值,使得[i,n-1)范围内最大值渐渐浮动到最右边,就像在水中的气泡最终会浮出水面一样,所以叫冒泡排序,当这种操作进行了[0,n)次(外循环),范围0~n中的最大值在第n位,第二大的值在第n-1位,以此类推,所有的元素就算是有序的了,并且因为在比较时,如果左边的值不大于右边的值不会做交换,所以冒泡排序还是稳定的一种排序。
发表于 2020-10-28 16:23:24 回复(0)
for (int i = 0; i < arr.length - 1; i++) {
    for (int j = i; j < arr.length - 1 - i; j++) {
        if (arr[i]>arr[j]) {
            int temp;
            temp = arr[j];
            arr[j] = arr[i];
            arr[i] = temp;
        }
    }
}
这样可以提高速度,留意 循环条件
发表于 2020-10-21 20:19:04 回复(1)
冒泡排序的思想是,对待排序的数组或集合进行多趟比较,每次比较数组中相邻的两个元素,如果前一个元素比后一个元素大才交换元素。在一趟排序中,会将最大的元素一个冒泡升序到最后位置,每比较完一次,可以将每次的待排比较元素个数递减。
发表于 2020-10-14 07:54:24 回复(0)
int temp = 0;
for (int i = 0; i < arr.length; i++) {
    for (int j = i; j < arr.length; j++) {
        if (arr[i]>arr[j]) {
            temp = arr[j];
            arr[j] = arr[i];
            arr[i] = temp;
        }
    }
}

发表于 2020-09-22 22:43:34 回复(0)
以递增排序为例:
说白了就是每次都从第0个数(类似湖底),每次都和右边的数比较,大的靠右(类似湖顶),这样就像是在冒泡一样。第一轮过去后,最大的数冒到了湖顶。第二次冒泡出了倒数第二大的数,最终停留在倒数第二位。大致伪代码如下

for(int j=arr.length - 1;j > 0;j--){ //表示湖顶
     for(int i=0;i<arr.length;i++){ //表示正在冒的泡
          if(arr[i] > arr[i+1]){
               swap(arr[i],arr[i+1]);//交换位置,冒泡
          }
     }
}
发表于 2020-09-16 10:20:47 回复(0)