八种排序算法(冒泡,插入,选择,快速,堆,归并,希尔,计数) 待续。。

各种排序算法实现及比较

1. 冒泡排序,时间复杂度O(N^2),“冒泡”:每次将最大的数放到数组末尾

两层循环,外层为趟数,内层实现每趟将最大的数移到数组尾部。每一趟针对未排序的数组,从头开始每次比较相邻的两个数,如果后面的数比前面的数小,就交换这两个数,一趟比较完之后最大的数就交换移到了数组最尾部。

void BubbleSort(vector array)
{
    int len=array.size();
    for(int i=0;i

2. 插入排序,时间复杂度O(N^2),“插入”:每次将数插入排序数组中合适的位置

两层循环,外层循环的i将数组分为两部分,左边是排好序的,右边是没有排序的,内层循环j指向没排序的第一个数字,先存下这个数字temp,然后将这个数字依次与前面的数字(从j-1开始到0)比较,如果当前数字比temp大,就将其后移一位,直到不满足这个条件,退出循环,将当前位置填上temp。

void InsertSort(vector array)
{
    int len=array.size();
    for(int i=0;i0)
        {
            if(temp

3. 选择排序,时间复杂度O(N^2),“选择”:每次遍历未排序数组选择最小的数与第一个数交换

两层循环,外层循环的i将数组分为两部分,左边是排好序的,右边是没有排序的,内层循环j指向没排序的第一个数字。每次遍历右边没有排序的数组,找到最小的数字,与第一个位置(j)的数字交换。

void SelectSort(vector array)
{
    int len=array.size();
    for(int i=0;i

4. 快速排序,时间复杂度O(NlogN)

分两步,首先在数组中选择一个基准数字,然后遍历数组,使得比基准数小的数都移到左边,比基准数大的都移到右边,然后对左右两边的数组进行快速排序,通过递归完成。

函数partition实现的功能:将基准数小的数都移到左边,比基准数大的都移到右边,并且返回基准值位置。

void QuickSort(vector array, int low, int high)
{
	if(low>=high)
		return;
	int pos=partition(array, low, high);
	if(pos>low)
	{
		QuickSort(array, low, pos-1);
	}
	if(pos

重点是partition函数,用两个前后指针完成两两交换,当i=j时停止循环,将最左边数字设为基准值,i从pos+1先往后走一直遇到第一个大于base的,j往前走一直遇到第一个小于base的,交换i和j位置的值,。最后结束循环的时候,交换小于基准值数组的最右边位置的值和基准值位置的值,要注意i指向的有可能是小于基准值数组的最右边的值(array[i]base),如果是第二种情况,则应该交换i-1位置的。

int partition(vector &array, int low, int high)
{
	int pos=low;
	int base=array[pos];
	int i=low+1;
	int j=high;
    while(i=base)
        {
            j--;
        }
		swap(array[i],array[j]);
    }
	int p;
	if(array[i]>base)
		p=i-1;
	else
		p=i;

	swap(array[p],array[pos]);
	return p;
}

4. 堆排序

http://www.cnblogs.com/kkun/archive/2011/11/23/2260286.html

5. 归并排序

你可能感兴趣的:(算法题)