# 排序算法列舉以及優化

```static void popPaiXu() {
int[] nums = {1, 12, 8, 4, 10, 8, 9, 20, 39, 30};

for (int i = nums.length - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (nums[j] > nums[j + 1]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}

for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + 、");
}

}```

```static void popPaiXu() {
int[] nums = {1, 12, 8, 4, 10, 8, 9, 20, 39, 30};
for (int i = nums.length - 1; i > 0; i--) {
System.out.println("lcs排序一次");
//1
boolean isNext = false; // 聲明一個變量來控制後續是否還需要進行遍歷冒泡
for (int j = 0; j < i; j++) {
if (nums[j] > nums[j + 1]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
//2
isNext = true;
}
}
//3
if (!isNext) {
break;
}
}
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + "、");
}
}```

1、4、8、8、9、10、12、20、30、39、

```static void popPaiXu2() {
int[] nums = {1, 12, 8, 4, 10, 8, 9, 20, 21, 22};

for (int i = nums.length - 1; i > 0; i--) {
System.out.println("lcs排序一次");
//1
int lastIndex = 0;  // 聲明一個index，記錄最後一次進行冒泡替換的索引值，下一次直接從這裏進行for循環,20\21\22本身就是有序的，所以無需進行for循環從而直接過
for (int j = 0; j < i; j++) {
if (nums[j] > nums[j + 1]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
//2
lastIndex = j + 1; // 把下一次要外部for循環的索引值存儲下來
}
}
//3
i = lastIndex;
}

for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + "、");
}

}```

1、4、8、8、9、10、12、20、21、22、

```static void selectPaiXu() {
int[] nums = {1, 12, 8, 4, 10, 88, 9, 20, 21, 22};
for (int i = nums.length - 1; i > 0; i--) {
int maxIndex = 0;
for (int j = 0; j < i; j++) {
if (nums[maxIndex] <= nums[j + 1]) {
maxIndex = j + 1;

}
}
int temp = 0;
temp = nums[maxIndex];
nums[maxIndex] = nums[i];
nums[i] = temp;
}

for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + "、");
}
}```

```static void chaRuPaiXu() {
int[] nums = {1, 12, 8, 4, 10, 88, 9, 20, 21, 22};

int cur;
for (int i = 0; i < nums.length - 1; i++) {
//1
cur = nums[i + 1];
//2
int pre = i;
while (pre >= 0 && cur < nums[pre]) {
// 3
nums[pre + 1] = nums[pre];
pre--;
}
//4
nums[pre + 1] = cur;

for (int k = 0; k < nums.length; k++) {
System.out.print(nums[k] + "、");
}
System.out.println(" ");
}

for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + "、");
}
}```

1、12、8、4、10、88、9、20、21、22、
1、8、12、4、10、88、9、20、21、22、
1、4、8、12、10、88、9、20、21、22、
1、4、8、10、12、88、9、20、21、22、
1、4、8、10、12、88、9、20、21、22、
1、4、8、9、10、12、88、20、21、22、
1、4、8、9、10、12、20、88、21、22、
1、4、8、9、10、12、20、21、88、22、
1、4、8、9、10、12、20、21、22、88、

```////        1、8、12、4;
////        1、8、12、12；
////        1、8、8、12；
////        1、4、8、12；
////        1、4、8、12、10；
////        1、4、8、12、12；
////        1、4、8、10、12；```

1、4、8、9、10、12、20、21、22、88、

```static void xiErPaiXu() {
int[] nums = {1, 12, 8, 4, 10, 88, 9, 20, 21, 22};
int gap = nums.length;
while (gap > 1) {
//1
gap = (int) Math.floor(gap / 2);
System.out.println("gap - " + gap);
int cur;
for (int i = gap; i < nums.length; i++) {
//2
cur = nums[i];
//3
int pre = i - gap;
while (pre > 0 && cur < nums[pre]) {
//4
nums[i] = nums[pre];
pre -= gap;
}
//5
nums[pre + gap] = cur;
}
for (int k = 0; k < nums.length; k++) {
System.out.print(nums[k] + "、");
}
System.out.println(" ");
}
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + "、");
}
}```

`1, 12, 8, 4, 10, 88, 9, 20, 21, 22 //原數組`

gap - 5
1、9、8、4、10、88、12、20、21、22、 第一次
gap - 2
1、4、8、9、10、20、12、22、21、88、 第二次
gap - 1
1、4、8、9、10、12、20、21、22、88、 第三次