#include <vector> #include <iostream> #include <string.h> #include <math.h> using namespace std; // 冒泡排序 vector<int> bubbleSort(vector<int> arr) { int len = arr.size(); int temp; for(int i=0; i<len-1; i++) { for(int j=0; j<len-i-1; j++) { if(arr[j]>arr[j+1]) { temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; } } } return arr; } // 選擇排序 vector<int> selectSort(vector<int> arr) { int len = arr.size(); int minIndex, temp; for(int i=0; i<len-1; i++) { minIndex = i; for(int j=i+1; j<len; j++) { // 找到最小值下標 if(arr[j]<arr[minIndex]) { minIndex = j; } } temp = arr[minIndex]; arr[minIndex] = arr[i]; arr[i] = temp; } return arr; } // 插入排序 vector<int> insertionSort(vector<int> arr) { int len = arr.size(); int preIndex, current; for(int i=1; i<len; i++) { preIndex = i-1; current = arr[i]; while(preIndex>=0 && arr[preIndex]>current) { arr[preIndex+1] = arr[preIndex]; preIndex--; } arr[preIndex+1] = current; } return arr; } // 希爾排序 vector<int> shellSort(vector<int> arr) { int len = arr.size(); for(int gap=floor(len/2); gap>0; gap=floor(gap/2)) { for(int i=gap; i<len; i++) { int j=i; //當前要插入的序列 int current = arr[i]; while(j-gap >= 0 && current<arr[j-gap]) { arr[j]=arr[j-gap]; j=j-gap; } arr[j]=current; } } return arr; } // 歸併排序 #include<iostream> using namespace std; void merge(int arr[], int L, int M, int R) { // L是最左邊序號,R是最右邊序號,M是中間序號的後一位 int LEFT_SIZE = M-L; int RIGHT_SIZE = R-M+1; int left[LEFT_SIZE]; int right[RIGHT_SIZE]; int i, j, k; // 1. fill in the left sub array for(i=L; i<M; i++) { left[i-L] = arr[i]; } // 2. fill in the right sub array for(i=M; i<=R; i++) { right[i-M] = arr[i]; } // for(auto j:left) { // cout <<"left " << j << endl; // } // for(auto k:right) { // cout << "right " << k << endl; // } // 3.merge into the original array i=0; j=0; k=L; while(i<LEFT_SIZE && j<RIGHT_SIZE) { if(left[i] < right[j]) { arr[k] = left[i]; i++; k++; } else { arr[k] = right[j]; j++; k++; } } while(i<LEFT_SIZE) { arr[k] = left[i]; i++; k++; } while(j<RIGHT_SIZE) { arr[k] = right[j]; j++; k++; } } void mergeSort(int arr[], int L, int R) { if(L==R) return; // L==R表示數組只有一位數字 int M=(L+R)/2; mergeSort(arr, L, M); mergeSort(arr, M+1, R); merge(arr, L, M+1, R); } // 快排 #include <iostream> using namespace std; int partition(int a[], int low, int high) { // i指向第一個大於pivot的值 // j指向小於等於pivot的值,若是j<pivot則開始交換 // 若是i沒有找到這個值,i和j指向同一個值 int pivot=a[high]; int i=low; for(int j=low; j<high; ++j) { // j指向當前遍歷元素,若是大於等於pivot,繼續向前 // 若是小於pivot,則和i指向的元素交換 if(a[j]<pivot) { swap(a[j], a[i]); i++; } } swap(a[i], a[high]); // 交換到中間 return i; // 返回的是一個分區 } void quickSort(int a[], int low, int high) { if(low<high) { int q = partition(a, low, high); quickSort(a, low, q-1); quickSort(a, q+1, high); } } int main() { // vector<int> a = {2, 3, 5, 1, 9, 7, 4}; // vector<int> b = {10, 8, 6}; // auto res = mergeSort(a); // for (auto i:res) { // cout << i << endl; // } // int arr[] = {7, 8, 9, 10, 4, 5, 6, 2}; // int L=0; // int R=7; // int M=4; // int i; // mergeSort(arr, L, R); // for(i=0; i<R; i++) { // cout << arr[i] << endl; // } int a[8] = {3, 1, 2, 4, 5, 8, 7, 6}; quickSort(a, 0, 7); for(auto i:a) cout << i << endl; return 0; }