解法不一定是最有效率、最低複雜度、最佳效能的,完全是依照自己的想法做!
---
假設題目要求:給一串整數數列,並根據數列長度為奇數或偶數有不同排序方式,
ex: 若數列長度為奇數{1, 2, 3, 4, 5},排序後應為: {2, 4, 5, 3, 1}
ex: 若數列長度為偶數{1, 2, 3, 4, 5, 6},排序後應為: {2, 4, 6, 5, 3, 1}
觀察題目後瞭解,關鍵為最大數的位置及排序方法,若數列長度為奇數,則最大數位置為數列長度 / 2 ,之後根據大小順序為最大數左邊、右邊、左邊、右邊...依序置入。若數列長度為偶數,則最大數位置為數列長度 / 2 - 1,之後根據大小順序為最大數右邊、左邊、右邊、左邊...依序置入。
解題構想:由使用者輸入一數字N, 之後生成數列長度為N的隨機正整數, 並用 Bubble Sort 針對原始數列進行排列。之後根據數列長度為奇數或偶數進行排序,排序時先將最大數插入其位置,之後以最大數將數列分割為左右兩邊,分別以兩個 int 變數儲存下一個數在左邊與右邊的位置;再以一 int 變數判斷目前位置該為最大數的左邊或右邊。
程式碼:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package algorithms; | |
import java.util.Scanner; | |
public class SpecialSorting { | |
static int numSize = 0; | |
static int[] aryRandomNumbers; | |
static int[] afterSorting; | |
public static void main(String[] args) { | |
// TODO Auto-generated method stub | |
Scanner scanner = new Scanner(System.in); | |
System.out.println("input a number, it will generating n-size random rumber"); | |
numSize = scanner.nextInt(); | |
afterSorting = new int[numSize]; | |
//產生數列長度為N的隨機正整數數列 | |
getRandomNumbers(numSize); | |
//使用泡沫排序法排序 | |
bubbleSort(); | |
sequentialSorting(); | |
} | |
static int putCount = -1; //-1:middle, 0:left, 1:right | |
static int putLeft = 0; //放在左邊的位置 | |
static int putRight = 0; //放在右邊的位置 | |
int putMiddle = 0; | |
private static void sequentialSorting() { | |
// TODO Auto-generated method stub | |
for(int i = aryRandomNumbers.length-1; i >= 0; i--) { | |
if(numSize%2 == 0) { | |
insertNumber(putCount, "even", aryRandomNumbers[i]); | |
} else { | |
insertNumber(putCount, "odd", aryRandomNumbers[i]); | |
} | |
} | |
} | |
private static void insertNumber(int flag, String size, int number) { | |
// TODO Auto-generated method stub | |
switch(flag) { //-1:middle, 0:left, 1:right | |
case -1: | |
{ | |
if(size.equals("even")) { | |
afterSorting[numSize/2 - 1] = number; | |
putLeft = numSize/2 - 1; | |
putRight = numSize/2 - 1; | |
putCount = 1; | |
} | |
else { | |
afterSorting[numSize/2] = number; | |
putCount = 0; | |
putLeft = numSize/2; | |
putRight = numSize/2; | |
} | |
break; | |
} | |
case 0: | |
{ | |
putCount = 1; | |
putLeft = putLeft-1; | |
afterSorting[putLeft] = number; | |
break; | |
} | |
case 1: | |
{ | |
putCount = 0; | |
putRight = putRight+1; | |
afterSorting[putRight] = number; | |
break; | |
} | |
} | |
System.out.println("\nsequential Sorting"); | |
for(int element:afterSorting ) { | |
System.out.print(element + " "); | |
} | |
} | |
} |