C++(各种)排序

排序(sort),是C++中一种重要的算法,其中,最常用的就是这几种了:

sort
方式稳定性时空复杂度
冒泡排序稳定O(n²)
鸡尾酒排序不太稳定O(nlogn)
分治排序不稳定O(logn)
插入排序稳定O(n^2)
计数排序超级稳定O(1)

 

冒泡排序和鸡尾酒排序

冒泡排序(bubble sort)之前讲过,懒得说了,详见:

https://blog.csdn.net/shit54188/article/details/128408417?spm=1001.2014.3001.5501

而只因尾酒排序94将本来n次顺序给为n/2趟来回,10分简单

分治排序

也称归并排序,是分治算法的一种,把数组分为若干个无序区间,再进行排序,我这也不是很懂,看下TA的吧:

归(头)并排序

//Project - MergeSort
#include <cstdio>
#include <cstdlib>

void merge(int a[],int low, int mid, int high) {
    int* t = (int*)malloc((high-low+1)*sizeof(int));
    int i = low, j = mid+1, k = 0;
    while (i<=mid && j<=high){
        if (a[i]<=a[j])
            t[k++] = a[i++];
        else
            t[k++] = a[j++];
    }
    while (i<=mid)
        t[k++] = a[i++];
    while (j<=high)
        t[k++] = a[j++];
    for (i=low,k=0;i<=high;i++,k++)
        a[i] = t[k];
    free(t);
}

void mergeSort(int a[], int low, int high) {
    if (low<high){
        int mid = (low+high)/2;
        mergeSort(a,low,mid);
        mergeSort(a,mid+1,high);
        merge(a,low,mid,high);
    }
}

int main() {
    int v[8] = {8,4,2,9,5,3,1,7};
    mergeSort(v,0,7);
    printf("Sorted: ");
    for (int i=0;i<8;i++)
        printf("%d ",v[i]);
    return 0;
}

插入排序

只要一直把无序区间中最大/最小 的数插入有序区间就行了

废话不说,上代码:

#include <bits/stdc++.h>
#define N 1550
using namespace std;
int a[N], n;

int main() {
    // 输入
    cin >> n; 
    for (int i = 1; i <= n; ++i) cin >> a[i];
	
    // 插入排序
    for (int i = 2; i <= n; ++i) {    // 按照第2个到第n个的顺序依次插入
        int j, x = a[i];    // 先将i号元素用临时变量保存防止被修改。

        // 插入过程,目的是空出分界线位置j,使得所有<j的部分<=x,所有>j的部分>x。
        // 循环维持条件,j>1,并且j前面的元素>x。
        for (j = i; j > 1 && a[j - 1] > x; --j) {   
            // 满足循环条件,相当于分界线应向前移,
            // 分界线向前移,就等于将分界线前面>x的元素向后移
            a[j] = a[j - 1];              
                                                    
        }
        // 找到分界线位置,插入待插入元素x
        a[j] = x;                         
    }
	
    // 输出
    for (int i = 1; i <= n; ++i) cout << a[i] << ' ';
    cout << endl;
    return 0;
}

计数排序

这是一个堪称史上最low最简单最强最稳定的排序,计算出a数组各个数出现次数,之后存放在b[Max]里,在按个数输出

#include <bits/stdc++.h>
using namespace std;
int a[1000005],n, b[1000005],cnt[1000005];
int main() {
    cin >> n;
    for (int i=1;i<=n;++i) {
        cin >> a[i];
        ++cnt[a[i]];
    }
    for (int i=0,j=0;i<1000005;++i){
    	for (int k=1;k<=cnt[i];++k){
            b[++j]=i; 
		}  
	}  
    for (int i=1;i<=n;++i){
    	cout<<b[i]<<' ';
	}
    return 0;
}

不难看出时空复杂度为O(1),就问你强不强?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ 中有许多种排序算法,下面我将介绍常见的几种排序算法及其实现。 1. 冒泡排序 冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就将它们交换过来。 ```c++ void bubble_sort(int arr[], int n){ for (int i = 0; i < n - 1; i++){ for (int j = 0; j < n - i - 1; j++){ if (arr[j] > arr[j + 1]){ int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ``` 2. 选择排序 选择排序是一种简单直观的排序算法。它的工作原理是:首先在未排序的数列中找到最小元素,然后将其存放到数列的起始位置,接着再从剩余未排序的元素中继续寻找最小元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 ```c++ void selection_sort(int arr[], int n){ for (int i = 0; i < n - 1; i++){ int min_index = i; for (int j = i + 1; j < n; j++){ if (arr[j] < arr[min_index]){ min_index = j; } } int temp = arr[i]; arr[i] = arr[min_index]; arr[min_index] = temp; } } ``` 3. 插入排序 插入排序是一种简单直观的排序算法。它的工作原理是:将未排序的元素一个一个地插入到已排序的序列中。 ```c++ void insertion_sort(int arr[], int n){ for (int i = 1; i < n; i++){ int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > key){ arr[j + 1] = arr[j]; j = j - 1; } arr[j + 1] = key; } } ``` 4. 快速排序 快速排序是一种常用的排序算法,它的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 ```c++ void quick_sort(int arr[], int start, int end){ if (start >= end){ return; } int pivot = arr[start]; int left = start; int right = end; while (left < right){ while (left < right && arr[right] >= pivot){ right--; } arr[left] = arr[right]; while (left < right && arr[left] <= pivot){ left++; } arr[right] = arr[left]; } arr[left] = pivot; quick_sort(arr, start, left - 1); quick_sort(arr, left + 1, end); } ``` 5. 归并排序 归并排序是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 ```c++ void merge(int arr[], int left, int mid, int right){ int n1 = mid - left + 1; int n2 = right - mid; int L[n1], R[n2]; for (int i = 0; i < n1; i++){ L[i] = arr[left + i]; } for (int j = 0; j < n2; j++){ R[j] = arr[mid + 1 + j]; } int i = 0; int j = 0; int k = left; while (i < n1 && j < n2){ if (L[i] <= R[j]){ arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } while (i < n1){ arr[k] = L[i]; i++; k++; } while (j < n2){ arr[k] = R[j]; j++; k++; } } void merge_sort(int arr[], int left, int right){ if (left < right){ int mid = left + (right - left) / 2; merge_sort(arr, left, mid); merge_sort(arr, mid + 1, right); merge(arr, left, mid, right); } } ``` 以上就是常见的几种排序算法的实现。除了以上算法,还有希尔排序、堆排序、计数排序、桶排序等等。每种算法都有其优点和缺点,需要根据实际情况选择合适的算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值