iT邦幫忙

0

java 氣泡排序+陣列 題目

  • 分享至 

  • xImage

題目是:
結果是:

不知道我錯在哪邊請求大大們教導謝謝。

import java.util.Arrays;
import java.util.Scanner;
public class LineraSearch{
	public static void main(String args[]){
		String name[] = new String[]{"陳一","林二","張三","李四","王五"};
		int age[] = new int[]{56, 45, 51, 48, 35};
		int t,pc;
		String a;
		Scanner scn = new Scanner(System.in);
		System.out.print("選擇按年齡排序方式,請輸入1或2(1.遞增 2.遞減):");
		pc = scn.nextInt();
		if(pc == 1){
		for (int i=age.length-2 ;i >= 0 ;i--){
			for (int j=0 ;j <= i ;j++){
				if(age[j] > age[j+1]){
				t= age[j];
				age[j] =age[j+1];
				age[j+1]=t;
				a=name[i];
				name[i]=name[i+1];
				name[i+1]=a;
					}
				}
			}
		for(int p=0; p<age.length ;p++){
			System.out.print("排序後:"+name[p]+age[p]+"歲,");
		}
		
		}
		else{
			for (int i=age.length+2 ;i <= 0 ;i++){
				for (int j=0 ;j >= i ;j--){
					if(age[j] < age[j+1]){
					t= age[j];
					age[j] =age[j+1];
					age[j+1]=t;
					a=name[i];
					name[i]=name[i+1];
					name[i+1]=a;
					}
				}
			}
			for(int p=0; p<age.length ;p++){
				System.out.print("排序後:"+age[p]);
			}
		}
	}
}
看更多先前的討論...收起先前的討論...
挑錯書了.
這樣學浪費時間.
krarm iT邦好手 1 級 ‧ 2015-06-03 16:23:09 檢舉
如果是學校作業呢?
換學校 或者 換老師
換個副本吧....
temo iT邦新手 1 級 ‧ 2015-06-03 16:29:31 檢舉
換科系XD

學校作業拿去問老師會比較快

他那本書我就沒印象了,不過右上角的圖案有點印象,好像考證照用的參考書?

話說錯誤是錯在哪.....還要用IDE輸入才知道結果
temo iT邦新手 1 級 ‧ 2015-06-03 16:31:04 檢舉
不能更改回應真麻煩...錯誤訊息也貼上來看看,自己都不知道錯在哪,也沒PO錯誤訊息
外獅佬 iT邦大師 1 級 ‧ 2015-06-03 16:35:45 檢舉
落寞...為什麼是用兩個陣列...為什麼不是一個二維陣列...落寞
weiclin iT邦高手 4 級 ‧ 2015-06-03 16:40:11 檢舉

for (int i=age.length+2 ;i <= 0 ;i++){  


這個迴圈應該永遠不會跑吧 汗

別浪費生命了
去學別的技術吧
外獅佬 iT邦大師 1 級 ‧ 2015-06-03 16:46:50 檢舉
放開那個Java....無言
wiselou提到:
放開那個Java....

擁抱那個Erlang偷笑
這個問題有問題啦!!
就作一種排序就好, 然後只要在輸出時逆著輸出就是另一種答案了.偷笑
外獅佬 iT邦大師 1 級 ‧ 2015-06-04 08:49:03 檢舉
那個書...好像是乙級技術士用書...
我們的政府怎麼了...技術士考這種東西....
外獅佬 iT邦大師 1 級 ‧ 2015-06-04 08:50:01 檢舉
就跟國家考試考三民主義一樣...中華民國現在是有在實施三民主義膩....
wiselou提到:
就跟國家考試考酸民主義一樣...中華民國現在是有在實施酸民主義膩....

偷笑
krarm iT邦好手 1 級 ‧ 2015-06-04 11:02:34 檢舉
有! 我酸 故我在

逃跑
krarm iT邦好手 1 級 ‧ 2015-06-04 11:08:54 檢舉
我一直記不住bubble sort, selection sort, insertion sort 的差別
這類演算法應該是不用教也會

merge sort, heap sort, quick sort才是要學的重點
外獅佬 iT邦大師 1 級 ‧ 2015-06-04 11:11:03 檢舉
重點是...目前來說,許多程式語言都已經實作了陣列的sorting了...
krarm iT邦好手 1 級 ‧ 2015-06-04 11:20:11 檢舉
因為資料型態不同,所以不用二維陣列。

那為甚麼用兩個陣列?不是一個結構陣列呢?
外獅佬 iT邦大師 1 級 ‧ 2015-06-04 11:30:38 檢舉
仔細看題目....因為題目亂出...落寞
kradark提到:
有! 我酸 故我在


我吃故我在

吃
賽門 iT邦超人 1 級 ‧ 2015-06-04 11:39:02 檢舉
去公園裏找小販買個泡泡槍, 然後玩泡泡比較好玩....偷笑
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
marsyang1
iT邦新手 4 級 ‧ 2015-06-03 21:23:49

無聊寫寫加減參考,這只是隨手寫寫的,不要太計較.

  1. 不要太執著在某些解不開的問題 , 後面的路還很長 , 例如物件導向.

  2. 因為Java是物件導向,而且我工作也沒什麼用過二維陣列,所以我就直接轉成物件處理.

  3. 切割多method是責任分派問題,單一method的事情越單純越好.你寫的method裡面塞太多,不易閱讀,導致連你自己都搞不懂問題出在哪.method責任切割完之後,debug才會比較容易.

  4. 實務上大部分sort都是直接用Collections.sort ,個人對演算法需要深入就另當別論.

    <pre class="c" name="code">
    public class TestMain {

    public static void main(String[] args) {
        String name[] = new String[]{"陳一", "林二", "張三", "李四", "王五"};
        int age[] = new int[]{56, 45, 51, 48, 35};
        List&lt;Person> personList = new LinkedList&lt;>();
        for (int i = 0; i &lt; name.length; i++) {
            personList.add(new Person(name[i], age[i]));
        }
        checkList(personList);
        System.out.println("----------------------------------");
        int order = 1;
        personList = bubbleSort(personList);
        if (order != 1) {
            Collections.reverse(personList);
        }
        checkList(personList);
    }
    
    private static void checkList(List&lt;Person> collections) {
        for (Person p : collections) {
            System.out.print(p.toString() + ", ");
        }
        System.out.println();
    }
    
    public static LinkedList&lt;Person> bubbleSort(List&lt;Person> collections) {
        System.out.println("Enter bubble sort");
        int j;
        boolean flag = true;
        Person temp;
        Person[] pArray = collections.toArray(new Person[collections.size()]);
    
        while (flag) {
            flag = false;
            for (j = 0; j &lt; pArray.length - 1; j++) {
                if (pArray[j].getAge() > pArray[j + 1].getAge()) {
                    temp = pArray[j];
                    pArray[j] = pArray[j + 1];
                    pArray[j + 1] = temp;
                    flag = true;
                }
            }
        }
        return new LinkedList&lt;>(Arrays.asList(pArray));
    }
    
    private static List&lt;Person> sort(List&lt;Person> collections) {
        System.out.println("Enter sort");
        Collections.sort(collections);
        return collections;
    }
    

    }

外層Class

&lt;pre class="c" name="code">
public class Person implements Comparable&lt;Person> {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return name + " " + age + " 歲 ";
    }

    @Override
    public int compareTo(Person person) {
        return Integer.compare(this.age, person.age);
    }
}
0
iverson68214
iT邦新手 4 級 ‧ 2015-06-07 08:20:31

用別的語言玩玩!參考邏輯就好。

&lt;pre class="c" name="code">
// kotlin
fun swap(arr: Array&lt;Person>, i: Int, j: Int): Array&lt;Person> {
    val temp = arr[i]
    arr[i] = arr[j]
    arr[j] = temp
    return arr
}

fun bubbleSort(arr: Array&lt;Person>, order: String): Array&lt;Person> {
    for (i in 0..arr.size-2) {
        for (j in i+1..arr.size-1) {
            when (order) {
                "Up" -> if (arr[i].age &lt; arr[j].age) swap(arr, i, j) 
                "Down" -> if (arr[i].age > arr[j].age) swap(arr, i, j) 
            }
        }
    }
    return arr
}

fun printTable(arr: Array&lt;Person>) {
    println("")
    println("  名字\t年齡")
    println("-".repeat(20))
    for (p in arr) {
        println("  ${p.name}\t ${p.age}")
    }
    println("")
}

data class Person(val name: String, val age: Int) 

fun main(args: Array&lt;String>) {
    var arr = array(
                Person("陳一", 56),
                Person("林二", 45),
                Person("張三", 51),
                Person("李四", 48),
                Person("王五", 35)
            )

    while (true) {
        printTable(arr)
        print("選擇按年齡排序方式,請輸入1或2(1.遞增 2.遞減 3.退出):")
        val input = readLine()  
        when (input) {
            "1" -> bubbleSort(arr, "Up")
            "2" -> bubbleSort(arr, "Down")
            "3" -> break
            else -> println("input error!")
        }
    }
    println("Good job bye!")
}
/* 輸出結果:  
  名字    年齡 
-------------------- 
  陳一     56 
  林二     45 
  張三     51 
  李四     48 
  王五     35 
 
選擇按年齡排序方式,請輸入1或2(1.遞增 2.遞減 3.退出): 
*/ 

可以先簡化問題
先單獨處理 int[]{56, 45, 51, 48, 35};
如果再添加 String[]{"陳一", "林二", "張三", "李四", "王五"}; 來一起處理

但複合型資料(名字、年齡 或 名字、性別、年齡、薪資)感覺當用 結構 形式較好排序
struct Person{
name: String,
age: Int
}
分成
int[]{56, 45, 51, 48, 35};
String[]{"陳一", "林二", "張三", "李四", "王五"};
感覺怪怪的

我要發表回答

立即登入回答