c++排序算法

#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;
}

猜你喜欢

转载自www.cnblogs.com/o-v-o/p/11266551.html