《Java資料結構和演算法》第二版 Robert lafore 編程作業 第三章

來源:互聯網
上載者:User

《Java資料結構和演算法》第二版 Robert lafore  編程作業 第三章

/*  3.1 bubbleSort.java程式(清單3.1)和BubbleSort專題applet中,in索引變數都是從左到  右移動的,直到找到最大資料項目並把它移動到右邊的out變數外。修改bubbleSort()方法,  使它成為雙向移動的。這樣,in索引先像以前一樣,將最大的資料項目從左移到右,當它到  達out變數位置時,它迴轉並把最小的資料項目從右移到左。需要兩個外部索引變數,一個在  右邊(以前的out變數),另一個在左邊。  3.2在isertSort.java程式(清單3.3)中給ArrayIns類加一個median()方法.這個方法將返回  數組的中間值.(回憶一下,數組中一半資料項目比中間值大,一半資料項目比中間值小。) 3.3在insertSort.java程式(清單3.3)中增加一個名為noDups()的方法,這個方法從已經有 序的數組中刪掉重複的資料項目而不破壞有序性。(可以用insertionSort()方法對資料排序, 或者也可以簡單地用main()方法將資料有序地插入到表中。)一種解決方案是每發現一個重 複的資料,就從這個位置開始到數組結尾都向前移動一個位置,但這樣就導致消耗很長的 O(N2)的時間級,起碼在有很多重複資料項目的情況下是這樣的。在設計的演算法中,不論有多 少重複資料,要確保資料項目最多隻能移動一次。這樣演算法只消耗O(N)數量級的時間。 3.4  還有一種簡單排序演算法是奇偶排序。它的思路是在數組中重複兩趟掃描。第一趟掃描選擇所有 的資料項目對,a[j]和a[j+1],j是奇數(j=1,3,5,……)。如果它們的關鍵字的值次序顛倒,就交 換它們。第二趟掃描對所有的偶數資料項目進行同樣的操作(j=2,4,6,……)。重複進行這樣兩趟 的排序直到數組全部有序。用oddEvenSort()方法替換bubbleSort.java程式(清單3.1)中的 bubbleSort()方法。確保它可以在不同資料量的排序中運行,還需要算出兩趟掃描的次數。奇 偶排序實際上在多處理器環境中很有用,處理器可以分別同時處理每一個奇數對,然後又同時 處理偶數對。因為奇數對是彼此獨立的,每一對都可以用不同的處理器比較和交換。這樣可以非 常快速地排序。 3.5修改insertSort.java程式(清單3.3)中的insertionSort()方法,使它可以計算排序過 程中複製和比較的次數並顯示出總數。為計算比較的次數,要把內層while迴圈的兩個條件分開。 用這個程式測量各種數量的逆序資料排序的複製和比較次數。結果滿足O(N2)嗎?與已經基本有 序的資料(僅有很少的資料無序)的情況一樣嗎?從對基本有序資料排序的表現中可得出關於這 個演算法效率的什麼結論? 3.6有一個有趣的方法用來刪除數組中相同的資料項目。插入排序演算法中用一個迴圈嵌套演算法,將 數組中的每一個資料項目與其他資料項目一一比較。如果要刪除相同的資料項目,可以這樣做(參見第 2章第2.6小節)。修改insertSort.java中的insertionSort()方法,使它可以在排序過程中 刪除相同的資料項目。方法如下:當找到一個重複資料項目的時候,通常用一個小於任何值的關索引值 來改寫這個相同資料項目(如果所有值都是正數,則可取-1)。於是,一般的插入排序演算法就會像 處理其他資料項目一樣,來處理這個修改了關索引值的資料項目,把它移到下標為0的位置。從現在開 始,演算法可以忽略這個資料項目。下一個相同的資料項目將被移到下標為1的位置,依此類推。排序 完成後,所有相同的資料項目(現在關索引值為-1)都在數組的開頭部分。可以改變數組的容量並 把需要的資料前移動數組下標為0的位置。 */package chap03;// bubbleSort.java// demonstrates bubble sort// to run this program: C>java BubbleSortApp////////////////////////////////////////////////////////////////class ArrayBub {private long[] a; // ref to array aprivate int nElems; // number of data items// --------------------------------------------------------------public ArrayBub(int max) // constructor{a = new long[max]; // create the arraynElems = 0; // no items yet}// --------------------------------------------------------------public void insert(long value) // put element into array{a[nElems] = value; // insert itnElems++; // increment size}// --------------------------------------------------------------public void display() // displays array contents{for (int j = 0; j < nElems; j++)// for each element,System.out.print(a[j] + " "); // display itSystem.out.println("");}// --------------------------------------------------------------public void bubbleSort() {int out, in;for (out = nElems - 1; out > 0; out--)// outer loop (backward) //這裡必須是 out > 0 如果是 > 1的話,4321 會排成 2134for (in = 0; in < out; in++)// inner loop (forward)if (a[in] > a[in + 1]) // out of order?swap(in, in + 1); // swap them} // end bubbleSort()// --------------------------------------------------------------// ==============================================================// 編程作業3.1 P78(97)public void bubbleSort1() {int leftout = 0, rightout = nElems - 1, in; // leftout,rightout為左右兩端指標for (; rightout > leftout; rightout--, leftout++) {for (in = leftout + 1; in < rightout; in++)if (a[in] > a[in + 1])swap(in, in + 1);for (in = rightout - 1; in > leftout; in--)if (a[in] < a[in - 1])swap(in, in - 1);}}// ==============================================================// 編程作業3.4 P79(98)// 奇偶排序的過程如下// 初始序列 4 3 2 1// 第1次// i為偶數比較 (4,3)和(2,1)對// 結果為 3 4 1 2// i為奇數比較 (4,1)對// 結果為 3 1 4 2// 第2次// i為偶數比較 (3,1)和(4,2)對// 結果為1 3 2 4// i為奇數比較 (3,2)對// 結果為1 2 3 4// 第3次// i為偶數比較 (1,2)和(3,4)對// 結果為1 2 3 4// i為奇數比較(2,3)// 結果為1 2 3 4// 此次比較沒有交換,所以排序結束public void oddEvenSort() {boolean change = true;while (change) {// 當不再有交換時,排序完成change = false;for (int i = 0; i < nElems - 1; i += 2) { // i為偶數if (a[i] > a[i + 1]) {swap(i, i + 1);change = true;}}for (int i = 1; i < nElems - 1; i += 2) { // i為奇數if (a[i] > a[i + 1]) {swap(i, i + 1);change = true;}}}}// ==============================================================// 使用一個獨立的方法不一定好,因為方法調用會增加一些額外的消耗。自己的程式裡將交// 換操作這段代碼直接放到程式中。private void swap(int one, int two) {long temp = a[one];a[one] = a[two];a[two] = temp;}// --------------------------------------------------------------} // end class ArrayBub// //////////////////////////////////////////////////////////////public class BubbleSortApp {public static void main(String[] args) {int maxSize = 100; // array sizeArrayBub arr; // reference to arrayarr = new ArrayBub(maxSize); // create the arrayarr.insert(77); // insert 10 itemsarr.insert(99);arr.insert(44);arr.insert(55);arr.insert(22);arr.insert(88);arr.insert(11);arr.insert(00);arr.insert(66);arr.insert(33);arr.display(); // display itemsarr.bubbleSort(); // bubble sort themarr.display(); // display them again// ======================================// 編程作業3.1 P78(97)arr = new ArrayBub(maxSize); // create the arrayarr.insert(4);arr.insert(3);arr.insert(2);arr.insert(1);arr.display(); // display itemsarr.bubbleSort1(); // bubble sort themarr.display(); // display them again// ======================================// //編程作業3.4 P79(98)ArrayBub arr1 = new ArrayBub(maxSize);arr1.insert(8);arr1.insert(7);arr1.insert(6);arr1.insert(5);arr1.display();arr1.oddEvenSort(); // 奇偶排序arr1.display();// ======================================} // end main()} // end class BubbleSortApp// //////////////////////////////////////////////////////////////
package chap03;// insertSort.java// demonstrates insertion sort// to run this program: C>java InsertSortApp//--------------------------------------------------------------class ArrayIns {private long[] a; // ref to array aprivate int nElems; // number of data items// --------------------------------------------------------------public ArrayIns(int max) // constructor{a = new long[max]; // create the arraynElems = 0; // no items yet}// --------------------------------------------------------------public void insert(long value) // put element into array{a[nElems] = value; // insert itnElems++; // increment size}// --------------------------------------------------------------public void display() // displays array contents{for (int j = 0; j < nElems; j++)// for each element,System.out.print(a[j] + " "); // display itSystem.out.println("");}// --------------------------------------------------------------public void insertionSort() {int in, out;for (out = 1; out < nElems; out++) // out is dividing line{long temp = a[out]; // remove marked itemin = out; // start shifts at outwhile (in > 0 && a[in - 1] >= temp) // until one is smaller,//這裡 a[in-1]= temp的時候,可以不用移動,可以改成 a[in-1] > temp{a[in] = a[in - 1]; // shift item to right--in; // go left one position}a[in] = temp; // insert marked item} // end for} // end insertionSort()// --------------------------------------------------------------// ==========================================================// 編程作業3.5 P79(98)public int insertionSort1() {int in, out;int compare = 0; // 比較次數int copy = 0; // 複製次數for (out = 1; out < nElems; out++) // out is dividing line{long temp = a[out]; // remove marked itemin = out; // start shifts at outwhile (in > 0) // until one is smaller,{if (a[in - 1] > temp) {a[in] = a[in - 1]; // shift item to right--in; // go left one positioncompare++;copy++;} else {compare++;break;}}a[in] = temp; // insert marked item} // end forreturn compare + copy;} // end insertionSort()// ==========================================================// 編程作業3.6 P79(98)public void insertionSort2() {int in, out, count = 0;for (out = 1; out < nElems; out++) // out is dividing line{long temp = a[out]; // remove marked itemin = out; // start shifts at outwhile (in > 0 && a[in - 1] >= temp && a[in - 1] != -1) // until one is smaller,{if (a[in - 1] == temp) {temp = -1;count++;}a[in] = a[in - 1]; // shift item to right--in; // go left one position}a[in] = temp; // insert marked item} // end fornElems -= count;for (int i = 0; i < nElems; i++) {a[i] = a[i + count]; // 把排好序的元素向前移動count個位置}} // end insertionSort()// ===========================================================// 編程作業3.2 P78(97) //數組的中間值,到底是位置上的中間,還是大小上的中間?public long median() {this.insertionSort(); // 先排序,再取中間值 //這個中間值是大小上的中間值.return a[nElems / 2];}// ===========================================================// 編程作業3.3 P78(97)// 方法一public void noDups() {this.insertionSort();// 先排序int holenumber = 0;final int FLAG = -1; // 標記為空白,假設使用者不會輸入負數for (int i = 0; i < nElems; i++) { // 把重複的都標記出來for (int j = i + 1; j < nElems; j++) {// 從i+1開始if (a[i] == a[j] && a[j] != FLAG) {a[j] = FLAG;holenumber++;}}}int firsthole = -1; // 第一個空位的索引for (int i = 0; i < nElems; i++) {if (a[i] == FLAG && firsthole == -1) { // 遇到第一個空位時,則這個空位為firstholefirsthole = i;} else if (a[i] != FLAG && firsthole != -1) {// 當有空位時,遇到一個非空值,就把這個非空值複製到firsthole的位置a[firsthole++] = a[i]; // 同時,firthole++,空位往後移一位}}nElems -= holenumber;}// 方法二public void noDups1() {this.insertionSort();// 先排序long NIL = Long.MIN_VALUE; // 標誌位for (int i = 0; i < nElems - 1; i++) {if (a[i] == a[i + 1]) {a[i] = NIL; // NIL為標誌位,相當於樓主的-1,使用的是Long.MIN_VALUE}}int order = 0;for (int temp = 0; temp < nElems;) {if (a[temp] != NIL) {// 因為a[0]不可能等於NIL所以才可以用這種方法if (temp > order) {a[order] = a[temp];}temp++;order++;} elsetemp++;}nElems = order;}// ===========================================================} // end class ArrayIns// //////////////////////////////////////////////////////////////public class InsertSortApp {public static void main(String[] args) {int maxSize = 100; // array sizeArrayIns arr; // reference to arrayarr = new ArrayIns(maxSize); // create the arrayarr.insert(77); // insert 10 itemsarr.insert(99);arr.insert(44);arr.insert(55);arr.insert(22);arr.insert(88);arr.insert(11);arr.insert(00);arr.insert(66);arr.insert(33);arr.display(); // display itemsarr.insertionSort(); // insertion-sort themarr.display(); // display them again// ======================================// 插入4321arr = new ArrayIns(maxSize); // create the arrayarr.insert(4);arr.insert(3);arr.insert(2);arr.insert(1);arr.display(); // display itemsarr.insertionSort(); // insertion-sort themarr.display(); // display them again// ======================================// 編程作業3.3 P78(97)arr = new ArrayIns(maxSize); // create the arrayarr.insert(2);arr.insert(3);arr.insert(4);arr.insert(3);arr.insert(3);arr.insert(1);arr.insert(2);arr.insert(1);arr.insert(1);arr.insert(1);System.out.println("插入重複值後:");arr.display();arr.noDups();System.out.println("重複資料刪除值後:");arr.display();// ======================================// 編程作業3.5 P79(98)arr = new ArrayIns(maxSize); // create the arrayint count;for (int i = 19; i >= 0; i--) {// 初始化為逆序數組arr.insert(i);}arr.insert(19);arr.insert(9);arr.insert(0);arr.display();count = arr.insertionSort1();arr.display();System.out.println("逆序數組比較複製總數:" + count); // 滿足O(N^2)arr = new ArrayIns(maxSize); // create the arrayfor (int i = 0; i <= 19; i++) {// 初始化為順序數組arr.insert(i);}arr.insert(19);arr.insert(9);arr.insert(0);arr.display();count = arr.insertionSort1();arr.display();System.out.println("順序數組比較複製總數:" + count); // 滿足O(N)// ======================================// 編程作業3.6 P79(98)arr = new ArrayIns(maxSize); // create the arrayarr.insert(2);arr.insert(3);arr.insert(4);arr.insert(3);arr.insert(3);arr.insert(1);arr.insert(2);arr.insert(1);arr.insert(1);arr.insert(1);System.out.println("插入重複值後:");arr.display();arr.insertionSort2();System.out.println("重複資料刪除值後:");arr.display();// ======================================} // end main()} // end class InsertSortApp
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.