乐趣区

关于算法:快排的思想与实现

一、疾速排序(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;
        }
    }
}
退出移动版