一、疾速排序(Quick Sort)

疾速排序采纳分治法。首先从数列中挑出一个元素作为两头值。顺次遍历数据,所有比两头值小的元素放在右边,所有比两头值大的元素放在左边。而后按此办法对左右两个子序列别离进行递归操作,直到所有数据有序。最现实的状况是,每次划分所抉择的两头数恰好将以后序列简直等分(平均排布),整个算法的工夫复杂度为O(n logn)。 最坏的状况是,每次所选的两头数是以后序列中的最大或最小元素(正序和逆序都是最坏),整个排序算法的工夫复杂度为O(n²)。

均匀工夫复杂度为O(n logn),空间复杂度为O(logn),是一种不稳固的排序算法。

附算法实现源码:

//疾速排序template <class T>int Partition(T data[],int left,int right){    T pivot=data[left];    while(left<right)    {        while(left<right&&data[right]>pivot)            right--;        data[left]=data[right];        while(left<right&&data[left]<=pivot)            left++;        data[right]=data[left];    }    data[left]=pivot;    return left;}template <class T>void QuickSort(T data[],int left,int right){if(left<right){    int p=Partition(data,left,right);    QuickSort(data,left,p-1);    QuickSort(data,p+1,right);}}

二、抉择排序(Selection Sort)

遍历所有数据,先在数据中找出最大或最小的元素,放到序列的起始;而后再从余下的数据中持续寻找最大或最小的元素,顺次放到序列中直到所有数据有序。原始数据的排列程序不会影响程序消耗工夫O(n²),绝对费时,不适宜大量数据排序。

均匀工夫复杂度为O(n²),空间复杂度为O(1),是一种不稳固的排序算法。

附算法实现源码:

 //抉择排序template <class T>void SelectionSort(T data[],int n){    for(int i=1;i<n;i++)    {        int k=i-1;        for(int j=i;j<n;j++)        {            if(data[j]<data[k])            {                k=j;            }        }        if(k!=i-1)        {            T t=data[k];            data[k]=data[i-1];            data[i-1]=t;        }    }}