快速排序改进算法

#include<iostream>
using namespace std;

const int M = 20;
void quickSort(int *data,const int left,const int right);
int partition(int *data,const int low,const int high);
void insertSort(int *data,const int left,const int right);
void swap(int &a,int &b);
int main()
{
	int size = 0;
	cin >> size;
	if (size > 100 || size < 1)
		return 0;
	int *data = new int[size];
	for (int i = 0; i < size; ++i)
		cin >> data[i];

	quickSort(data,0,size-1);
	for (int i = 0; i < size; ++i)
		cout << data[i] << " ";

	return 0;
}

void quickSort(int *data, const int left, const int right)
{
	if (right - left < M)
		insertSort(data,left,right);
	//if (right <= left)
		//return;
	else
	{
		int pivotPos = partition(data,left,right);
		quickSort(data,left,pivotPos-1);
		quickSort(data,pivotPos+1,right);
	}
}

int partition(int *data, const int low, const int high)
{
	int pivotPos = low;
	int pivotValue = data[low];
	for (int i = low+1; i <= high; ++i)
	{
		if (pivotPos == i)
			continue;
		if (pivotValue > data[i])
		{
			swap(data[++pivotPos], data[i]);
		}
	}
	data[low] = data[pivotPos];
	data[pivotPos] = pivotValue;
	return pivotPos;
}

void swap(int &a, int &b)
{
	int temp = a;
	a = b;
	b = temp;
}

void insertSort(int *data, const  int left, const int right)
{
	int current = 0;
	for (int i = left+1; i <= right; ++i)
	{
		current = data[i];
		int j;
		for (j = i-1; j >=left; --j)
		{
			if (current < data[j])
			{
				data[j + 1] = data[j];
			}
			else
			{
				break;
			}
		}
		data[j+1] = current;
	}
}



对于长度比较小的序列,快排并不比简单的排序算法快,因此加了一个插入排序(当序列长度小于20时用插入排序)。

研究表明,序列长度取值为5——25时,采用直接插入排序要比快排至少快10%。



你可能感兴趣的:(快速排序,插入排序)