10^11
先來talk talk 什麼是排序演算法
一種能將一串資料依照特定排序方式排列的演算法
其中,有六個較為常見的排序方式:
1.泡沫排序(Bubble Sort)
2.插入排序(Insertion Sort)
3.選擇排序(Selection Sort)
4.快速排序(Quick Sort)
5.合併排序(Merge Sort)
6.堆排序(Heap Sort)
穩定排序法(stable sorting):
如果鍵值相同之資料,在排序後相對位置與排序前相同時,稱穩定排序
eg:
3,1,3*,6 -> 1,3,3*,6
不穩定排序法(unstable sorting):
如果鍵值相同之資料,在排序後相對位置與排序前不相同時,稱不穩定排序。
eg:
3,1,3*,6 -> 1,3*,3,6
它重複地走訪要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。
這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。
它重複地走訪要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。
這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。
為穩定排序法。
這個演算法是最簡單瞭解和實作的排序演算法之一,
但它對於包含大量的元素的數列排序是很沒有效率的。
它和這隻生物不同,
它需要花很多時間才能完成
步驟說明:
遞迴法程式碼(可輸入輸出版本)
#include <bits/stdc++.h>
using namespace std;
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (arr[j] > arr[j+1]) {
// 交換arr[j]和arr[j+1]
int x = arr[j];
arr[j] = arr[j+1];
arr[j+1] = x;
}
}
}
}
int main() {
int arr[] = {6,5,4,3,2,1};
int n = 6;
cout << "原始數列:";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
bubbleSort(arr, n);
cout << "排序後數列:";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}MergeSort 是一種經典的分治排序演算法,其主要思想是將待排序的陣列分割成兩個子陣列,然後分別對這兩個子陣列進行排序,最後再將排好序的子陣列合併起來。
為穩定排序法。
分割(Divide)
排序(Sort)
合併(Merge)
分割程式碼
void MergeSort(int Array[], int front, int end) {
if (front < end) {
//重複直到每個分組只剩下一個值
int mid = front + (end - front) / 2; // 計算中間值
MergeSort(Array, front, mid);
MergeSort(Array, mid + 1, end);//遞迴對左右兩部分進行排序
Merge(Array, front, mid, end);//合併到原始陣列中
}
}
讀取陣列程式碼
void Merge(int Array[], int front, int mid, int end) {
// 將陣列分成兩個子陣列,並複製到 LeftSubArray 和 RightSubArray
int n1 = mid - front + 1; // 計算左子陣列的大小
int n2 = end - mid; // 計算右子陣列的大小
int LeftSubArray[n1], RightSubArray[n2];
// 將元素複製到左子陣列
for (int i = 0; i < n1; i++)
LeftSubArray[i] = Array[front + i];
// 將元素複製到右子陣列
for (int j = 0; j < n2; j++)
RightSubArray[j] = Array[mid + 1 + j];
}排序+合併程式碼
void Merge(int Array[], int front, int mid, int end) {
int i = 0, j = 0, k = front;
// 將左右子陣列中的元素進行比較,合併到原始陣列中
while (i < n1 && j < n2) {
if (LeftSubArray[i] <= RightSubArray[j]) {
Array[k] = LeftSubArray[i];
i++;
}
else {
Array[k] = RightSubArray[j];
j++;
}
k++;
}
}最終判斷程式碼
void Merge(int Array[], int front, int mid, int end) {
// 將左子陣列中剩餘的元素放入原始陣列
while (i < n1) {
Array[k] = LeftSubArray[i];
i++;
k++;
}
// 將右子陣列中剩餘的元素放入原始陣列
while (j < n2) {
Array[k] = RightSubArray[j];
j++;
k++;
}
}遞迴法程式碼(理解用版本)
#include <bits/stdc++.h>
using namespace std;
void Merge(int Array[], int front, int mid, int end) {
// 將陣列分成兩個子陣列,並複製到 LeftSubArray 和 RightSubArray
int n1 = mid - front + 1; // 計算左子陣列的大小
int n2 = end - mid; // 計算右子陣列的大小
int LeftSubArray[n1], RightSubArray[n2];
// 將元素複製到左子陣列
for (int i = 0; i < n1; i++)
LeftSubArray[i] = Array[front + i];
// 將元素複製到右子陣列
for (int j = 0; j < n2; j++)
RightSubArray[j] = Array[mid + 1 + j];
int i = 0, j = 0, k = front;
// 將左右子陣列中的元素進行比較,合併到原始陣列中
while (i < n1 && j < n2) {
if (LeftSubArray[i] <= RightSubArray[j]) {
Array[k] = LeftSubArray[i];
i++;
} else {
Array[k] = RightSubArray[j];
j++;
}
k++;
}
// 將左子陣列中剩餘的元素放入原始陣列
while (i < n1) {
Array[k] = LeftSubArray[i];
i++;
k++;
}
// 將右子陣列中剩餘的元素放入原始陣列
while (j < n2) {
Array[k] = RightSubArray[j];
j++;
k++;
}
}
void MergeSort(int Array[], int front, int end) {
if (front < end) {
// 計算中間索引,並遞迴地對左右兩部分進行排序和合併
int mid = front + (end - front) / 2;
MergeSort(Array, front, mid);
MergeSort(Array, mid + 1, end);
Merge(Array, front, mid, end);
}
}
遞迴法程式碼(可輸入輸出版本)
#include <iostream>
using namespace std;
// 合併兩個已排序的子陣列
void Merge(int Array[], int front, int mid, int end) {
// 計算左右子陣列的大小
int n1 = mid - front + 1;
int n2 = end - mid;
// 創建左右子陣列
int LeftSubArray[n1], RightSubArray[n2];
// 複製元素到左子陣列
for (int i = 0; i < n1; i++)
LeftSubArray[i] = Array[front + i];
// 複製元素到右子陣列
for (int j = 0; j < n2; j++)
RightSubArray[j] = Array[mid + 1 + j];
int i = 0, j = 0, k = front;
// 合併左右子陣列到原始陣列中
while (i < n1 && j < n2) {
if (LeftSubArray[i] <= RightSubArray[j]) {
Array[k] = LeftSubArray[i];
i++;
}
else {
Array[k] = RightSubArray[j];
j++;
}
k++;
}
// 將左子陣列中剩餘的元素放入原始陣列
while (i < n1) {
Array[k] = LeftSubArray[i];
i++;
k++;
}
// 將右子陣列中剩餘的元素放入原始陣列
while (j < n2) {
Array[k] = RightSubArray[j];
j++;
k++;
}
}
// 遞迴排序
void MergeSort(int Array[], int front, int end) {
if (front < end) {
// 計算中間索引,並遞迴地對左右兩部分進行排序和合併
int mid = front + (end - front) / 2;
MergeSort(Array, front, mid);
MergeSort(Array, mid + 1, end);
Merge(Array, front, mid, end);
}
}
int main() {
int Array[6];
cout << "Enter 6 elements: ";
for (int i = 0; i < 6; ++i)
cin >> Array[i];
MergeSort(Array, 0, 5);
cout << "Sorted array: ";
for (int i = 0; i < 6; ++i)
cout << Array[i] << " ";
cout << endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
// 合併兩個已排序的子陣列
void Merge(int Array[], int front, int mid, int end) {
// 計算左右子陣列的大小
int n1 = mid - front + 1;
int n2 = end - mid;
// 創建左右子陣列
int LeftSubArray[n1], RightSubArray[n2];
// 複製元素到左子陣列
for (int i = 0; i < n1; i++)
LeftSubArray[i] = Array[front + i];
// 複製元素到右子陣列
for (int j = 0; j < n2; j++)
RightSubArray[j] = Array[mid + 1 + j];
int i = 0, j = 0, k = front;
// 合併左右子陣列到原始陣列中
while (i < n1 && j < n2) {
if (LeftSubArray[i] <= RightSubArray[j]) {
Array[k] = LeftSubArray[i];
i++;
}
else {
Array[k] = RightSubArray[j];
j++;
}
k++;
}
// 將左子陣列中剩餘的元素放入原始陣列
while (i < n1) {
Array[k] = LeftSubArray[i];
i++;
k++;
}
// 將右子陣列中剩餘的元素放入原始陣列
while (j < n2) {
Array[k] = RightSubArray[j];
j++;
k++;
}
}
// 遞迴排序
void MergeSort(int Array[], int front, int end) {
if (front < end) {
// 計算中間索引,並遞迴地對左右兩部分進行排序和合併
int mid = front + (end - front) / 2;
MergeSort(Array, front, mid);
MergeSort(Array, mid + 1, end);
Merge(Array, front, mid, end);
}
}
int main() {
int Array[6];
cout << "Enter 6 elements: ";
for (int i = 0; i < 6; ++i)
cin >> Array[i];
MergeSort(Array, 0, 5);
cout << "Sorted array: ";
for (int i = 0; i < 6; ++i)
cout << Array[i] << " ";
cout << endl;
return 0;
}