排序

                   基础算法

*排序

快排

不稳定(非复杂度)

时间复杂度:nlogn

思想:先排序,在递归。

题目:https://www.acwing.com/problem/content/787/

#include<iostream>
using namespace std;
const int maxn = 1e6+10;
int n, q[maxn];

void quick_sort(int q[], int l, int r)
{
    if(l >= r) return;
    int x = q[l+r >> 1], i = l - 1, j = r + 1;
    while(i < j)
    {
        do i++; while(q[i] < x);
        do j--;  while(q[j] > x);
        if(i < j) swap(q[i], q[j]);
    }
    quick_sort(q, l, j); //这里的j换成i的话会变成死循环
    quick_sort(q, j+1, r);
}

int main()
{
    scanf("%d", &n);
    for(int i = 0; i < n; i++) 
        scanf("%d", &q[i]);
    quick_sort(q, 0, n-1);
    for(int i = 0; i < n; i++)
        printf("%d ", q[i]);
    return 0;
}

 

注意:1.当x = q[l]时,若给出一段数字为已排好的数字,复杂度可达到O(n*n),故用x = q[l+r >>1].

 2.do-while改成while会莫名其妙的tle

 

 

 

归并排序

稳定 

时间复杂度:nlogn

思想:先递归再排序

 题目:https://www.acwing.com/problem/content/789/

#include<iostream>
using namespace std;
const int maxn = 1e6+10;
int n, q[maxn], res[maxn], num; //res作为临时数组更新

void merge_sort(int q[], int l, int r)
{
    if(l >= r) return ; 
    int mid = (l+r) >> 1; 
    merge_sort(q, l, mid); merge_sort(q, mid+1, r);
    int i = l, j = mid+1, k = 0;
    while(i <= mid && j <= r)
        if(q[i] <= q[j]) res[k++] = q[i++];
            else res[k++] = q[j++];
    while(i <= mid) res[k++] = q[i++];
    while(j <= r) res[k++] = q[j++];
    for(int i = l, j = 0; i <= r; i ++, j ++) q[i] = res[j]; //注意这一步res数组的更新
}

int main()
{
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
        scanf("%d", &q[i]);
    merge_sort(q, 0, n-1);
    for(int i = 0; i < n; i++)
        printf("%d ", q[i]);
    return 0;
} 

 

*二分

 

posted @ 2020-08-24 00:06  ATKevin  阅读(102)  评论(0)    收藏  举报