C++复习之排序

2016-10-30  本文已影响0人  bingxin

排序有很多种,这里记录一下经常会用到的:插入排序(直接、二分法、希尔排序)、交换排序(冒泡、快排)、选择排序(简单选择排序、堆排序)、归并排序、基数排序、外部排序,先说前三种。
什么叫排序算法是稳定的?比如:{3,5,7,7,2},如果排完序原来第一个7仍然在第二个7前面,则是稳定的,否则,则是不稳定的。

int main()
{
    int sorted[10] = { 8,5,3,9,7,11,41,33,22,14 };
    cout << "输出待排序数组:" << endl;
    for (int p = 0;p < 10;p++)
    {
        cout << sorted[p]<<endl;
    }
//.......排序算法
    cout << "排序数组:" << endl;
    for (int p = 0;p < 10;p++)
    {
        cout << sorted[p] << endl;
    }
    system("pause");
    return 0;

1.直接插入排序:时间复杂度O(n^2),稳定。

int i, j;
    for (i = 1;i < n;i++)
    {
        int temp = sorted[i];
        j = i - 1;
        while (j >= 0 && temp < sorted[j])
        {
            sorted[j + 1] = sorted[j];
            j--;
        }
        sorted[j + 1] = temp;
    }

2.二分法插入排序,时间复杂度O(n^2),稳定

//二分法插入排序
    int left, right, mid,temp;
    for (int p = 1;p < 10;p++)
    {
        temp = sorted[p];
        left = 0;
        right = p-1;        
        while (left <= right)
        {
            mid = (right + left) / 2;
            if (temp < sorted[mid])
                right = mid-1;
            else
                left = mid+1;
        }
        for (int i = p - 1;i >= left;i--)
        {
            sorted[i + 1] = sorted[i];
        }
        sorted[left] = temp;
    }

3.冒泡排序:O(n^2),稳定

//冒泡排序
    int flag = 0;
    for (int i = 0;i < 10;i++)
    {
        for (int j = 1;j < 10 - i;j++)
        {
            if (sorted[j] < sorted[j - 1])
            {
                flag = 1;
                int tempt = sorted[j];
                sorted[j] = sorted[j - 1];
                sorted[j - 1] = tempt;
            }
        }
        if (flag == 0)
            break;
    }

4.快排:分割、分治、合并,时间复杂度O(nlogn),不稳定

int partition(int sorted[], int left, int right)
{

    int pivot = sorted[left];
    while (left < right)
    {
        while (left<right && sorted[right]>pivot)
            right--;
        sorted[left] = sorted[right];
        while (left < right && sorted[left] <= pivot)
            left++;
        sorted[right] = sorted[left];
    }
    sorted[left] = pivot;
    return left;
}
void Quicksort(int sorted[], int left, int right)
{

    if (left < right)
    {
        int p = partition(sorted, left, right);
        Quicksort(sorted, left, p - 1);
        Quicksort(sorted, p + 1, right);
    }
}
//快速排序
    Quicksort(sorted, 0, 9);

5.简单选择排序:O(n^2),不稳定

    //简单选择排序
    for (int i = 1;i < 10;i++)
    {
        int k = i - 1;
        for (int j = i;j < 10;j++)
        {
            if (sorted[k] > sorted[j])
                k = j;
        }
        if (k != i - 1)
        {
            int tempt = sorted[k];
            sorted[k] = sorted[i-1];
            sorted[i - 1] = tempt;
        }
    }
上一篇下一篇

猜你喜欢

热点阅读