版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}