冒泡排序不起作用
Bubble Sorting not working
我正在使用冒泡排序算法并在代码上实现它。 objective是对一个大小为N的整数数组进行冒泡排序,统计数据比较次数和数据移动次数,其中数据比较次数为整数比较次数,数据移动次数为的整数交换位置。最后我们只计算执行排序所花费的时间。现在,问题是当 N 的值很大时,比如 1000 / 10000 /20000 等。对于前 30-50 个测试用例,冒泡排序有效,但在那之后,可以看到许多较小的数字没有被排序.要记住的另一件事是我将数组元素的值分配给了随机数。
import java.util.Random;
import java.util.Scanner;
public class Bubblesort {
public static long DC;
public static long DM;
public static int[] BBSort(int arr[],int n) {
int K,t,tmp;
long Data_comp=0,Data_move=0;
K = n;
while(K!=0)
{
t = 0;
for (int i = 0; i < K-1; i++) {
if(arr[i]>arr[i+1])
{
tmp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = tmp;
t = i;
Data_move++;
}
Data_comp++;
}
K = t;
}
DC = Data_comp;
DM = Data_move;
return arr;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Random r = new Random();
int N;
N = sc.nextInt();
int a[];
a = new int[N];
for (int i = 0; i < N; i++) {
a[i]=r.nextInt(10000);
}
long StartTime,EndTime;
long Totaltime;
StartTime = System.currentTimeMillis();
BBSort(a, N);
EndTime = System.currentTimeMillis();
Totaltime = EndTime - StartTime;
for (int j = 0; j < N; j++) {
System.out.println(a[j]);
}
System.out.println("Time taken for sorting = "+Totaltime);
System.out.println("Number of data comparisons = "+DC );
System.out.println("Number of data movement = "+3*DM);
}
}
好的,我相信我已经找到你的问题了。
因此,在冒泡排序中,程序每次都需要运行遍历每个数字。如果程序不这样做,您就会为数字创造机会,让他们找到进入错误位置的方式,并被困在那里。
在您的函数中 BBSort
您的程序正在设置 for 循环 运行 的次数 运行 到最后一个索引发生交换的次数。在那种情况下,您可能在最后有两个顺序正确的数字。 IE。以这个列表为例:{1, 2, 9, 5, 6, 10} 在这个数组中,代码会识别两个数字正确排序的位置。这意味着,当它达到 6 和 10 时,它会说 "Okay, those two are sorted" 并且再也不会触及 6。这是我制作并运行的冒泡排序的一些伪代码:
for i = 0 ; i < number of items in array; i++{
for j = 0; j < number of items in array; j++{
if (list[j] < list[j+1])
swap list[j] with list[j+1];
}
}
希望本文对您有所帮助并且一切顺利!
您的问题在于您使用变量 t 的方式。只需将其删除并在每个 运行 的末尾使用 K-- 即可解决您的问题。
public static int[] BBSort(int arr[],int n) {
int K,tmp;
long Data_comp=0,Data_move=0;
K = n;
while(K!=0)
{
for (int i = 0; i < K-1; i++) {
if(arr[i]>arr[i+1])
{
tmp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = tmp;
Data_move++;
}
Data_comp++;
}
K--;
}
DC = Data_comp;
DM = Data_move;
return arr;
}
我正在使用冒泡排序算法并在代码上实现它。 objective是对一个大小为N的整数数组进行冒泡排序,统计数据比较次数和数据移动次数,其中数据比较次数为整数比较次数,数据移动次数为的整数交换位置。最后我们只计算执行排序所花费的时间。现在,问题是当 N 的值很大时,比如 1000 / 10000 /20000 等。对于前 30-50 个测试用例,冒泡排序有效,但在那之后,可以看到许多较小的数字没有被排序.要记住的另一件事是我将数组元素的值分配给了随机数。
import java.util.Random;
import java.util.Scanner;
public class Bubblesort {
public static long DC;
public static long DM;
public static int[] BBSort(int arr[],int n) {
int K,t,tmp;
long Data_comp=0,Data_move=0;
K = n;
while(K!=0)
{
t = 0;
for (int i = 0; i < K-1; i++) {
if(arr[i]>arr[i+1])
{
tmp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = tmp;
t = i;
Data_move++;
}
Data_comp++;
}
K = t;
}
DC = Data_comp;
DM = Data_move;
return arr;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Random r = new Random();
int N;
N = sc.nextInt();
int a[];
a = new int[N];
for (int i = 0; i < N; i++) {
a[i]=r.nextInt(10000);
}
long StartTime,EndTime;
long Totaltime;
StartTime = System.currentTimeMillis();
BBSort(a, N);
EndTime = System.currentTimeMillis();
Totaltime = EndTime - StartTime;
for (int j = 0; j < N; j++) {
System.out.println(a[j]);
}
System.out.println("Time taken for sorting = "+Totaltime);
System.out.println("Number of data comparisons = "+DC );
System.out.println("Number of data movement = "+3*DM);
}
}
好的,我相信我已经找到你的问题了。
因此,在冒泡排序中,程序每次都需要运行遍历每个数字。如果程序不这样做,您就会为数字创造机会,让他们找到进入错误位置的方式,并被困在那里。
在您的函数中 BBSort
您的程序正在设置 for 循环 运行 的次数 运行 到最后一个索引发生交换的次数。在那种情况下,您可能在最后有两个顺序正确的数字。 IE。以这个列表为例:{1, 2, 9, 5, 6, 10} 在这个数组中,代码会识别两个数字正确排序的位置。这意味着,当它达到 6 和 10 时,它会说 "Okay, those two are sorted" 并且再也不会触及 6。这是我制作并运行的冒泡排序的一些伪代码:
for i = 0 ; i < number of items in array; i++{
for j = 0; j < number of items in array; j++{
if (list[j] < list[j+1])
swap list[j] with list[j+1];
}
}
希望本文对您有所帮助并且一切顺利!
您的问题在于您使用变量 t 的方式。只需将其删除并在每个 运行 的末尾使用 K-- 即可解决您的问题。
public static int[] BBSort(int arr[],int n) {
int K,tmp;
long Data_comp=0,Data_move=0;
K = n;
while(K!=0)
{
for (int i = 0; i < K-1; i++) {
if(arr[i]>arr[i+1])
{
tmp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = tmp;
Data_move++;
}
Data_comp++;
}
K--;
}
DC = Data_comp;
DM = Data_move;
return arr;
}