【代码分享】

//希尔排序
void ShellSort(int a[], int n)
{
//gap是间隔(增量)
int gap = n;
while (gap > 1)
{
gap /= 2;//间隔(增量)每次循环都缩小一半

	//end表示  每一组  有序序列最末尾的元素的下标
	int end = 0;
	//tmp表示  每一组  无序序列的第一个元素的下标
	int tmp = 0;
	int i = 0;
	//把插入排序中的1都换成gap
	for (i = 0; i < n - gap; i++)
	{
		end = i;
		tmp = a[end + gap];
		while (end >= 0)//end
		{
			//如果前gap个元素大于后gap个,就让前gap个向后移gap位
			//给后gap个可插入的空隙
			if (a[end] > tmp)
			{
				a[end + gap] = a[end];
				end-=gap;
			}
			else
			{	//因为是从已经有序的序列的末尾向前插入
			    //所以前一个之前的元素都比它小,所以不用再比较,直接结束循环
				break;
			}
		}
		//插入空出的空隙
		a[end + gap] = tmp;
	}
}

快排

int san(int a[], int left, int right)
{
	int mid = (left + right) / 2;
	if (a[left] > a[right])
	{
		if (a[mid] > a[right])
			return left;
		else if (a[mid] > a[right])
			return mid;
		else
			return right;
	}
	if (a[left] > a[mid])
	{
		if (a[right] > a[left])
			return left;
		else if (a[right] > a[mid])
			return right;
		else
			return mid;
	}
	if (a[mid] > a[right])
	{
		if (a[left] > a[mid])
			return mid;
		else if (a[left] > a[right])
			return left;
		else
			return right;
	}
}

int Qsortkey1(int a[], int left, int right)
{
	//挖坑法
	int begin = left, end = right;

	//三数取中
	int tmp = san(a, left, right);
	Swap(&a[tmp], &a[begin]);

	int key = a[begin];
	int keyi = begin;
	int pivot = begin;

	while (begin < end)
	{
		//向左找小
		while (begin < end && a[end] >= key)
			end--;
		a[pivot] = a[end];
		pivot = end;
		//向右找大
		while (begin < end && a[begin] <= key)
			begin++;
		a[pivot] = a[begin];
		pivot = begin;
	}
	a[begin] = key;
	pivot = begin;
	keyi = pivot;

	return keyi;
}

//快排1
void Qsort1(int a[], int left, int right)
{
	if (left >= right)
		return;
	
	int keyi = Qsortkey1(a, left, right);

	//递归
	Qsort1(a, left, keyi - 1);
	Qsort1(a, keyi + 1, right);

}

你可能感兴趣的:(c语言)