数据结构之排序

1.插入排序

#include 
using namespace std;

const int N = 1e5 = 10;

int n;
int a[N];

void insert_sort()
{
    for(int i = 2; i <= n; i++)
    {
        int key = a[i];
        int j = i - 1;
        while(j >= 1 && a[j] > key)
        {
            a[j + 1] = a[j];
            j--;
        }
        a[j + 1] = key;
    }
}
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    insert_sort();
    for(int i = 1; i <= n; i++) cout << a[i] << " ";
    return 0;
}

2.选择排序

#include 
using namespace std;

const int N = 1e5 + 10;

int n;
int a[N];

void selection_sort()
{
    for(int i = 1; i < n; i++)
    {
        int pos = i;
        for(int j = i + 1; j <= n; j++)
        {
            if(a[j] < a[pos])
            {
                pos = j;
            }
        }
        swap(a[i], a[pos]);
    }
}
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    selection_sort();
    for(int i = 1; i <= n; i++) cout << a[i] << " ";
    return 0;
}

3.冒泡排序

#include 
using namespace std;

const int N = 1e5 + 10;

int n;
int a[N];

void bubble_sort()
{
    for(int i = n; i > 1; i--)
    {
        bool flag = false;
        for(int j = 1; j < i; j++)
        {
            if(a[j] > a[j + 1])
            {
                swap(a[j], a[j + 1]);
                flag = true;
            }
        }
        if(flag == false) return;
    }
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    bubble_sort();
    for(int i = 1; i <= n; i++) cout << a[i] << " ";
    return 0;
}

4.堆排序

#include 
using namespace std;

const int N = 1e5 + 10;
int n;
int a[N];
void down(int parent, int len)
{
    int child = parent * 2;
    while(child <= len)
    {
        if(child + 1 <= len && a[child + 1] > a[child]) child++;

        if(a[child] <= a[parent]) return;
        swap(a[child], a[parent]);
        parent = child;
        child = parent * 2;
    }
}
void heap_sort()
{
    // 1.建堆
    for(int i = n / 2; i >= 1; i--)
    {
        down(i, n);
    }
    // 2.排序
    for(int i = n; i > 1; i--)
    {
        swap(a[1], a[i]);
        down(1, i - 1);
    }
}
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    heap_sort();
    for(int i = 1; i <= n; i++) cout << a[i] << " ";
    return 0;
}

5.快速排序

#include 
#include 

using namespace std;

const int N = 1e5 + 10;
int n;
int a[N];

// 优化:随机选择基准元素
int get_random(int left, int right)
{
    return a[rand() % (right - left + 1) + left];
}

void quick_sort(int left, int right)
{
    if(left >= right) return;
    // 1.选择基准元素
    int p = get_random(left, right);
    // 2.数组分三块
    int l = left - 1, i = left, r = right + 1;
    while(i < r)
    {
        if(a[i] < p) swap(a[++l], a[i++]);
        else if(a[i] == p) i++;
        else swap(a[--r], a[i]);
    }
    quick_sort(left, l);
    quick_sort(r, right);
}
int main()
{
    srand(time(0));
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    quick_sort(1, n);
    for(int i = 1; i <= n; i++) cout << a[i] << " ";
    return 0;
}

6.归并排序

#include 
using namespace std;

const int N = 1e5 + 10;
int n;
int a[N];
int tmp[N]; // 辅助归并排序,合并两个有序数组

void merge_sort(int left, int right)
{
    if(left >= right) return;
    // 1.先一分为二
    int mid = (left + right) >> 1;
    // 2.先让左右区间有序
    merge_sort(left, mid);
    merge_sort(mid + 1, right);
    // 3.合并两个有序数组
    int cur1 = left, cur2 = mid + 1, i = left;
    // [left, mid] [mid + 1, right]
    while(cur1 <= mid && cur2 <= right)
    {
        if(a[cur1] <= a[cur2]) tmp[i++] = a[cur1++];
        else tmp[i++] = a[cur2++];
    }
    while(cur1 <= mid) tmp[i++] = a[cur1++];
    while(cur2 <= right) tmp[i++] = a[cur2++];
    for(int j = left; j <= right; j++)
    {
        a[j] = tmp[j];
    }
}
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    merge_sort(1, n);
    for(int i = 1; i <= n; i++) cout << a[i] << " ";
    
    return 0;
}

你可能感兴趣的:(数据结构,C++,数据结构,排序算法,算法)