我正在通过冒泡排序对数字进行排序。我想看看这个排序是否可以通过仅使用单个循环完成,因为我们在冒泡排序中使用2个循环。有人可以告诉我它是如何完成的,甚至是否可能?
答案 0 :(得分:3)
冒泡排序的工作方式是移动彼此相邻的值对。所以,例如,你有这个清单:
list = {5, 3, 6, 11, 2}
第一次迭代,将逐对配对,如果必要则切换位置:
{3, 5, 6, 11, 2}
{3, 5, 6, 11, 2}
{3, 5, 6, 11, 2}
{3, 5, 6, 2, 11}
我们已完成循环的1次迭代,如您所见,列表未排序。您需要多次迭代才能实现排序。
但是,可以做的是只使用一个循环来保持迭代直到它被排序,这可以通过根据原始冒泡排序切换标志来改变迭代索引来实现:
bool valuesSwitched = false;
int list[5] = {5, 3, 6, 11, 2};
int len = 5;
for(int i = 1; i <= len; i++)
{
if(i == len)
{
if(!valuesSwitched) break;
valuesSwitched = false;
i = 1;
}
if(list[i - 1] > list[i])
{
int temp = list[i - 1];
list[i - 1] = list[i];
list[i] = temp;
valuesSwitched = true;
}
}
答案 1 :(得分:0)
我们可以在最佳情况下实现O(n)的冒泡排序。
冒泡排序中的最佳情况是整个数组的排序。在这种情况下,您比较第一遍中的相邻元素,并跟踪您所进行的交换次数。
完整数组排序后,您的掉期数将为零。因此,你将摆脱循环。
我们将通过对传统的冒泡排序算法进行一些小改动来得到答案。
public class BubbleSort {
public static void main(String args[]){
int arr[] = {1,2,3,4,5,6};
BubbleSort bubbleSort = new BubbleSort();
bubbleSort.sort(arr);
for(int i=0; i <arr.length; i++){
System.out.print(arr[i]);
}
}
public void sort(int arr[]){
boolean flag = true;
for(int i=0; i < arr.length -1; 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;
flag=false;
}
}
if(flag){
break;
}
}
}
}