排序算法总结(3.15)

一、常用的排序算法及特点

  1. 快速排序
  2. 选择排序
  3. 冒泡排序
  4. 堆排序
  5. 归并排序
  6. 希尔排序
  7. 桶排序

1、快速排序是不稳定的,最坏时间复杂的O(n^2),平均和最好时间负责度均为O(nlogn)。它的基本思想是分治。

(1)从序列中找出一个pivot,

(2)然后将数组中的元素分别与pivot比较,放在pivot的两侧,分成了连个区域S1,S2。

(3)然后对S1、S2再执行相同的算法即可得到结果。

(4)基本条件:S1,S2的长度为1或者0。

// ConsoleApplication5.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include  <iostream>
using namespace std;
void Quick_Sort(int a[], int l, int r);

int _tmain(int argc, _TCHAR* argv[])
{
    int a[5] = { 3, 1, 5, 2, 4 };
    Quick_Sort(a,0,4);
    for (int i = 0; i < 5; i++)
    {
        cout << a[i] << endl;
    }
    return 0;
}

/*
快速排序,一种时间复杂度为O(NlogN)的排序算法
特点:大数据量速度比较快,能达到O(NlogN)的时间复杂度,但是不稳定,因为枢纽元素的选择,可能会导致算法运行时间的不同
void Quick_Sort(int a[], int l,int r)
{

}
1、选定枢纽元素,一般取第一个元素,即key =a[l],i=l;j=r;
2、从数组后方向前遍历,即j--,直到找到小于key的元素,将aa[j]保存到a[i]
3、从数组左侧往右遍历,即i++,直到a[i]大于key,将a[i]保存到a[j]
4、一直循环,知道i==j,将key值放入a[i]
5、继续对枢纽元素左侧,右侧分别进行快速排序(分治的思想)

*/

void Quick_Sort(int a[], int l, int r)
{

    int i = l, j = r;
    int key = a[i];
    if (i > j)
        return;
    while (i < j)
    {
        while (i < j && a[j] >= key)
        {
            j--;
        }
        if (i < j)
        {
            a[i++] = a[j];
        }
        while (i < j && a[i] <= key)
        {
            i++;
        }
        if (i < j)
        {
            a[j--] = a[i];
        }
    }
    a[i] = key;

    Quick_Sort( a, l, i - 1);
    Quick_Sort( a, i + 1, r);

}
原文地址:https://www.cnblogs.com/wll-zju/p/4339824.html