zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    Visual Studio 存在版本之间冲突
    Failed to load resoure:the serve responded with a status of 405 (Method Not Allowed)
    Excel 导入解析数据 NPOIExcelHelper
    WIN10 SERVICES -- 部署IIS
    高德地图API-搜索提示并定位到位置,卫星地图和标准地图的切换
    BIMFCE选择全量绘制
    JS中如何获取当前日期,并与输入日期作比较
    html中input标签放入小图标
    div跟随浏览器大小而改变
    vue-amap接入高德地图示例
  • 原文地址:https://www.cnblogs.com/o-v-o/p/11266551.html
Copyright © 2011-2022 走看看