希尔排序and快速排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Android_chunhui/article/details/89328901

希尔排序(shell sort)这个排序方法又称为缩小增量排序,是1959年D·L·Shell提出来的。该方法的基本思想是:设待排序元素序列有n个元素,首先取一个整数increment(小于n)作为间隔将全部元素分为increment个子序列,所有距离为increment的元素放在同一个子序列中,在每一个子序列中分别实行直接插入排序。然后缩小间隔increment,重复上述子序列划分和排序工作。直到最后取increment=1,将所有元素放在同一个子序列中排序为止。 由于开始时,increment的取值较大,每个子序列中的元素较少,排序速度较快,到排序后期increment取值逐渐变小,子序列中元素个数逐渐增多,但由于前面工作的基础,大多数元素已经基本有序,所以排序速度仍然很快。

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


void shellsort(vector<int> & arr)
{
	int increment = arr.size();
	do{
		for (int i = increment; i < arr.size(); i++)
		{//增量为increment的插入排序。
		//如果前面排序好的元素大于当前元素,那么就把之前的元素向后移,把当前元素插入到前面的位置。所以用链表应该会更好。
			int tmp = arr[i];
			int j = i - increment;
			for (; j >= 0 && arr[j] > tmp;)
			{
				arr[j + increment] = arr[j];
				j -= increment;
			}
			arr[j + increment] = tmp;
		}
		increment = increment / 3 + 1;
	} while (increment > 1);

}
int main()
{
	vector<int> v = {21,25,49,25,16,8};
	shellsort(v);
	for (int i = 0; i <v.size(); i++)
		cout <<v[i] << endl;

	return 0;
}

参考:
https://blog.csdn.net/weixin_37818081/article/details/79202115

快速排序采用分治法的策略。首先选定一个基准值,通过一趟遍历将数组分成两部分,让基准左边的数比基准小右边的数比基准大。

步骤:
1)选定第一个元素为基准,然后从数组两端向中间遍历,如果右边的数小于基准就交换,如果左边的数比基准大也交换,直到左右指针相同。这样一趟排序后左边的值小于基准右边的值大于基准。
2)对基准左右两部分分别执行上出操作,递归。

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


void quick_sort(int *arr, int left, int right)
{
	//递归终止条件
	if (left >= right)
		return;
	int i = left, j = right;
	int x = arr[left];
	while (i < j)
	{
		while (i<j && arr[j]>x)
			j--;
		if (i < j)//没有必要真的执行元素交换,因为基准元素换来换去最终呆在最后遍历指针的位置。
			//所以这里只是把不符合要求的元素移过来,并没有把基准元素复制过去。
			arr[i++] = arr[j];
		while (i < j && arr[i] < x)
			i++;
		if (i < j)
			arr[j--] = arr[i];
	}
	arr[i] = x;//基准元素最终呆在最后遍历指针的位置。
	quick_sort(arr, left, i - 1);
	quick_sort(arr, i + 1, right);
}
int main()
{
	int v[6] = {21,25,49,25,16,8};
	quick_sort(v, 0, 5);
	for (int i = 0; i <6; i++)
		cout <<v[i] << endl;

	return 0;
}

参考:
https://www.cnblogs.com/skywang12345/p/3596746.html

猜你喜欢

转载自blog.csdn.net/Android_chunhui/article/details/89328901