c++排序算法

Posted o-v-o

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

以上是关于c++排序算法的主要内容,如果未能解决你的问题,请参考以下文章

C++算法之——常用算法总结

c++快速排序算法

算法笔记 排序算法完整介绍及C++代码实现 HERODING的算法之路

C++排序算法小结

十大排序算法对比和C++实现

十大排序算法对比和C++实现