排序算法

来源:互联网 发布:申请哥伦比亚大学知乎 编辑:程序博客网 时间:2024/06/05 21:54

1.插入排序
就是一个一个的对已排好序的序列比较,直至找到第一个比它小的数,比它大的数都要向后移一位,O(n*n)

void InsertSort(int a[], int len){    for (int i = 1; i < len; i++)    {        int key = a[i];        int j;        for (j = i - 1; j >= 0; j--)        {            if (a[i] < a[j])                a[j + 1] = a[j];            else break;        }        a[j + 1] = key;    }    for (int i = 0; i < len; i++)        cout << a[i] << " ";}

2.冒泡排序 (每次最后一位有序)

for (int i = 0; i < n;i++)    for (int j = 0; j < n - i-1; j++)    {        if (a[j]>a[j + 1])        {            int tmp = a[j];            a[j] = a[j + 1];            a[j + 1] = tmp;        }    }

3.选择排序(每次第一位有序)

for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
if (a[j] < a[i])
swap(a[j], a[i]);
}
}

4.快速排序(挑选基准,每次基准有序)

void QuickSort(int a[],int n,int first,int last){    if (first < last)    {        int key = a[first];        int start = first;        int end = last;        while (start < end)        {            while (start < end&&a[end] >= key)                end--;            a[start] = a[end];            while (start < end&&a[start] < key)                start++;            a[end] = a[start];        }            a[start] = key;            QuickSort(a, n, first, start - 1);            QuickSort(a, n, start + 1, last);        }   }

5.堆排序
最大堆 每个节点大于它的左右节点,输出根节点,根节点用最后一个节点替换,再保证最大根,循环输出即可

6.归并排序
由于将两个有序序列合并的时间复杂度为a+b
将原序列不断地一分为二,共有log n,然后再将它们依次合并,每次的复杂度为n
总的复杂度为nlogn

原创粉丝点击