希尔排序:
首先我们了解一下希尔排序的思想
希尔排序可以看做是高级的插入排序
他在遇到倒叙数组时 会比插入排序好很多
先将数组分为 (数组元素个数-1)/2个小数组 对这些小数组进行插入排序
再将数组合并为 (数组元素个数-1)/2/2个小数组 对这些小数组进行插入排序
直到合并成了一个数组 在进行插入排序
#include<iostream>
using namespace std;
void ShellSort(int arr[],int nLen)
{
if (arr == NULL || nLen <= 1)
{
return;
}
for(int sum = nLen / 2;sum>0;sum=sum/2)
{
for(int Arrid = 0; Arrid<sum; Arrid++)//一共遍历几个数组
{
for(int i=Arrid;i<nLen;i+=sum)//当前数组的遍历(数组不一定是连续的)
{
//插入排序
int nTemp = arr[i];
int j = i - sum;
while (j >= Arrid &&arr[j]>nTemp)
{
arr[j + sum] = arr[j];
j-=sum;
}
arr[j + sum] = nTemp;
}
}
}
}
int main()
{
int arr[10] = { 9,8,7,6,5,4,3,3,1,0 };
ShellSort(arr,10);
for (int val : arr)
{
cout << val<<" ";
}
return 0;
}
归并排序:
把数组分成若干个有序数组 再经过一次一次的小数组建的排序 合成一个数组
可以理解为 以快速排序相反
#include<iostream>
using namespace std;
void mSort(int arr[], int nBegin, int mid, int nEnd)
{
int* aTemp=new int[nEnd - nBegin + 1];
int i = nBegin;
int j = mid + 1;
int k = 0;
//遍历两个数组 一个到结尾就结束
//按大小放入数组中
//判断第一个(第二个数组)是否结束
//顺序放入
//将辅助数组放入原数组
//释放辅助空间
while (i<=mid&&j<=nEnd)
{
if (arr[i] > arr[j])
{
aTemp[k] = arr[j];
j++;
k++;
}
else
{
aTemp[k] = arr[i];
i++;
k++;
}
}
while(i <= mid)
{
aTemp[k] = arr[i];
k++;
i++;
}
while(j<=nEnd)
{
aTemp[k] = arr[j];
k++;
j++;
}
int nIndex = nBegin;
for (int l = 0; l < nEnd - nBegin + 1; l++)
{
arr[nIndex] = aTemp[l];
nIndex++;
}
delete aTemp;
aTemp = NULL;
}
void MergoSort(int arr[], int nBegin,int nEnd)
{
if (arr == nullptr || nBegin >= nEnd)
return;
int mid = (nBegin + nEnd) / 2;
MergoSort(arr, nBegin, mid);
MergoSort(arr, mid+1, nEnd);
mSort(arr, nBegin, mid, nEnd);
}
int main()
{
int arr[10] = { 9,8,7,6,5,4,3,3,1,0 };
MergoSort(arr, 0,9);
for (int val : arr)
{
cout << val << " ";
}
return 0;
}