java - 算法问题(气泡插入和选择排序)打印出来
问题描述
我在打印时遇到了问题。当我运行程序时,我得到了这个:
TEST PROBLEM: 10
0
0
0
0
0
0
0
0
10
我目前只使用 readNumbers() 方法(我已经注释掉了其他方法)。我一直遇到一个问题,它会进行比较和交换。但是,将排序后的数字打印出来,如下所示。
File 1 contains: 10,1,2,3,4,5,6,7,8,9,10
file 2 contains: 10,10,9,8,7,6,5,4,3,2,1
file 3 contains: 10,3,9,10,8,2,7,5,1,4
我的代码:
import java.io.*;
public class BubblesortA
{
public static void insertionSort (int [] data)
{
int comp=0;
int swaps=0;
int in, out, temp;
for (out=1; out < data.length; out++)
{
temp = data[out];
comp++;
for (in=out; in > 0 && data[in-1] >= temp; in--)
{
data[in] = data[in-1];
swaps++;
}
data[in] = temp;
}
System.out.println("Insertions sort comps: "+comp);
System.out.println("Insertion sort swap: "+swaps);
System.out.println();
}
public static void selectSort (int [] data )
{
int in, out, min;
int counter;
int comparisons=0;
int swaps=0;
for (out=0; out < data.length-1; out++)
{
min = out;
comparisons++;
for (in = out+1; in < data.length; in++)
{
if (data[in] < data[min])
{
min = in; // new minimum
swaps++;
}
}
int tmp = data[out]; // swap items
data[out] = data[min]; //
data[min] = tmp; //
}
System.out.println("Select sort Comp: "+comparisons);
System.out.println("Select sort Swaps: "+swaps);
System.out.println();
}
public static void generateRandom(int gty)
{
int counter;
int [] fillArray = new int [gty];
int random;
for (counter=0; counter < fillArray.length; counter++)
{
random = (int) (Math.random() * 100+1);
fillArray [counter] = random;
}
bubbleSort(fillArray);
selectSort(fillArray);
insertionSort(fillArray);
}
public static void readNumbers (String fileName)
{
int counter;
int number;
int [] data = new int[fileName.length()];
try
{
FileReader fr = new FileReader(fileName);
BufferedReader br = new BufferedReader(fr);
fileName = br.readLine();
for(counter=0; counter < fileName.length(); counter++)
{
number = Integer.parseInt(fileName);
data [counter] = number;
System.out.println(" TEST PROBLEM: "+number+ " ");
fileName = br.readLine();
}
br.close();
fr.close();
bubbleSort(data);
}
catch (IOException e)
{
System.out.println(e);
}
}
public static void bubbleSort (int [] numbers)
{
int outter;
int inner;
int temp;
int counter;
boolean sorted = false;
int comparisons=0;
int swaps =0;
while(!sorted)
{
for(outter=0; outter < numbers.length; outter++)
{
comparisons++;
sorted = true;
for (inner = 0; inner < numbers.length - 1 - outter; inner++)
{
if (numbers[inner] > numbers[inner + 1])
{
temp = numbers[inner];
numbers[inner] = numbers[inner + 1];
numbers[inner + 1] = temp;
swaps++;
sorted = false;
}
}
}
/**
int hold = numbers.length -1;
while (hold != 0 && sorted)
{
comparisons++;
sorted = false;
for (inner = 0; inner < hold; inner++)
{
if (numbers[inner] > numbers[inner + 1])
{
temp = numbers[inner];
numbers[inner] = numbers[inner + 1];
numbers[inner + 1] = temp;
swaps++;
sorted = true;
}
}
}
*/
}
for(counter=0; counter < numbers.length; counter++)
{
System.out.println(numbers[counter]);
}
System.out.println();
System.out.println("BubbleSort Comparsions: "+comparisons);
System.out.println("BubbleSort Swaps: "+swaps);
System.out.println();
}
公共静态无效主要(字符串[]参数){
int [] = {10,9,8,7,6,5,4,3,2,1,};
String file1 = "File1.txt";
String file2 = "File2.txt";
String file3 = "File3.txt";
//bubbleSort(data);
readNumbers("File1.txt");
//readNumbers("File2.txt");
//readNumbers("File3.txt");
//generateRandom(100);
}//main
}//class
解决方案
您使用了相同的变量“fileName”作为文件名和内容的长度
int[] data = new int[fileName.length()]; //This is incorrect, it should be numbers count in the file
以下方法对你有用
public static void readNumbers(String fileName) {
int counter;
int number;
int[] data = new int[11]; //EDIT 1
try {
FileReader fr = new FileReader(fileName);
BufferedReader br = new BufferedReader(fr);
fileName = br.readLine();
for (counter = 0; counter < 11; counter++) { //EDIT 2
number = Integer.parseInt(fileName);
data[counter] = number;
System.out.println(" TEST PROBLEM: " + number + " ");
fileName = br.readLine();
}
br.close();
fr.close();
bubbleSort(data);
} catch (IOException e) {
System.out.println(e);
}
}
文件内容 10 9 8 7 6 5 4 3 2 1 10
建议:而不是硬编码11,你应该用while循环替换for循环并循环直到readLine()方法不返回null
您可以使用下面的代码来获取文件中的行数
private static int getLength(String fileName) {
int count = 0;
try {
FileReader fr = new FileReader(fileName);
BufferedReader br = new BufferedReader(fr);
while ((br.readLine()) != null) {
count++;
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
return count;
}
推荐阅读
- android - 找不到 play-services-ads-identifier-17.0.0.jar
- pandas - 熊猫在开始和中间读取不同的 csv 文件
- kubernetes - 我的 PersistentVolumeClaim 不会绑定到 NFS PersistentVolume——我做错了什么?
- bash - 鱼壳:仅当先前的输出存在时,才在提示之前添加换行符
- c# - 如何设置服务以使我的 C# 控制台应用程序在后台运行?
- c# - 将数据库连接字符串密码从 Azure 保管库检索到 web.config
- javascript - Discord 机器人未运行
- java - 如何访问从 Hibernate AbstractEvents 和 EventListeners 调用 repository.save(entity) 时使用的原始实体?
- c# - Automapper 开放泛型
- python-3.x - 如何在 altair.layered 图中配置条形图?