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;
    }
    
  • 相关阅读:
    DB2 for Z/os Statement prepare
    Foreign key (referential) constraints on DB2 LUW v105
    复制Informational constraints on LUW DB2 v105
    DB2 SQL Mixed data in character strings
    DB2 create partitioned table
    MVC中使用EF的技巧集(一)
    Asp.Net MVC 开发技巧(二)
    Linq使用技巧及查询示例(一)
    Asp.Net MVC 开发技巧(一)
    Asp.Net MVC Identity 2.2.1 使用技巧(八)
  • 原文地址:https://www.cnblogs.com/o-v-o/p/11266551.html
Copyright © 2011-2022 走看看