快速排序、插入排序、归并排序

#include <iostream>
#include <vector>
#include <stack>
using namespace std;

//插入排序
void inertsort(int *a,int n)
{
	int i,j,temp;
	for(i =1;i < n;i++)
	{
		j = i;
		while(j > 0&& a[j] < a[j-1])  //插入的值需要与原先序列中的值依次比较大小
		{
			temp = a[j];
			a[j] = a[j-1];
			a[j-1] = temp;
			j--;
		}
	}
}

//快速排序
void quicksort(int *a,int low, int high)
{
	int key = a[low];
	int i = low;
	int j = high;
	while(i < j)
	{
		if(i < j)
		{
			while(i < j&&a[j] >= key) //从后往前寻找第一个小于key的值
			{
				j--;
			}
			if(i < j)
			{
				a[i] = a[j];
				i += 1;
				while(i<j&&a[i]<= key) //从前往后寻找第一个大于Key的值
				{
					i++;
				}
				if(i <j)
				{
					a[j] = a[i];
					j--;
				}

			}
		}
	}
	a[i] = key;
	if(low < i-1) quicksort(a,low,i-1);
	if(j+1< high) quicksort(a,j+1,high);
}

//归并排序
void merge(int *a, int low,int mid,int high,int *c) //将a[low:mid]数组和a[mid+1,high]数组合并到数组c中
{
	int k = 0;
	int idxa = low,idxb = mid +1;
	while(idxa <= mid && idxb <= high)
	{
		if(a[idxa] <= a[idxb])
		{
			c[k++] = a[idxa++];
		}
		else
		{
			c[k++] = a[idxb++];
		}
	
	}
	while(idxa <= mid) //如果a[low:mid]数组有剩余,则说明剩余的值都比a[mid+1,high]大
	{
		c[k++] = a[idxa++];
	}
	while(idxb <= high) //同上
	{
		c[k++] = a[idxb++];
	}
	for(int i =0; i < k; i++) //最后将值赋给数组a,由于每次low的起始位置不定,不始终为0
	{
		a[low+i] = c[i];
	}
}
void mergesort(int *a,int low,int high, int *c)//依次递归直到只有一个元素,此时有序
{
	int mid = 0;
	if(low < high)
	{
		mid = (low + high)/2;
		mergesort(a,low,mid,c); 
		mergesort(a,mid+1,high,c);
		merge(a,low,mid,high,c);
	}

}

int main(void)  
{  
	int a[7] = {1,3,5,7,9,0,8};
	int c[10] ={0} ;
	mergesort(a,0,6,c);
	for(int i=0;i<7;i++)
	{
		cout<<a[i];
	}
	return 0;  
}

  其中插入排序和快速排序均属于内排序,而归并排序则是外排序,由于归并排序使用了外部内存,用空间换取了时间,所以归并排序的时间复杂度最坏和最好都为O(N*logN),快速排序最好为O(N*logN),最坏为O(N^2);

原文地址:https://www.cnblogs.com/xqn2017/p/8021670.html