希尔排序(缩小增量排序) 时间复杂度:O(nlogn)~O(n^2)
#include "iostream"
using namespace std;
void shell_sort( int arr[], int n)
{
int i ; //循环变量
int j; //循环变量
int d; //增量
int key; //临时保存一个变量
for(d=n/2;d>=1;d=d/2) //逐渐缩短“步长” ,最初分成n/2个组,步长逐渐减小,直至每一个元素为一组
{
//每一趟采用插入排序
for(i=d;i<n;i++) //i=d 将所分组的第二个元素往前插,因为第一个元素已经有序
{
key=arr[i]; //保存一下
for(j=i ; j>=d && key < arr[j-d]; j=j-d)
{
arr[j] = arr[j - d];
}
arr[j]=key; //分组插入排序 和 普通的不一样
}
}
}
int main()
{
int arr[]={2,3,5,2,3,1,6,7,4,5};
shell_sort(arr,10);
for(int i=0;i<10;i++)
{
cout<<arr[i]<<" ";
}
}
快速排序
#include<iostream>
using namespace std;
int func( int arr[], int left, int right) //找到轴值(分界值),分割成两个子列,分别递归
{
int temp = arr[left];
while (left < right)
{
while ((left < right) && (arr[right] >= temp))
{
right -= 1; //子列的右值指向左移
}
arr[left] = arr[right]; //在轴值右侧找到了比最左端小的数,放在最左端
while ((left < right) && (arr[left] <= temp))
{
left += 1; //子列的左值指向往右移
}
arr[right] = arr[left]; //在轴值左侧找到了比右侧的数,放在刚刚交换过的right那里
}
arr[right] = temp; //此时left = right
return left; //此时left = right
}
void quick_sort(int *arr, int left, int right)
{
if (left < right)
{
int mid = func(arr, left, right); //找到轴值(中值)
quick_sort(arr, mid + 1, right); //递归左子列
quick_sort(arr, left, mid - 1); // 递归右子列
}
}
int main()
{
int arr[11] = { 9,1,3,5,9,8,7,6,2,4,1 };
quick_sort(arr, 0, 10);
for (int i = 0; i < 11; i++)
{
cout << arr[i] << " ";
}
}
归并排序
将序列中数字分为若干组,最后每个数字一组
将若干组两两合并,使之有序,直至合并成最后一组
#include<iostream>
using namespace std;
//合并arr[]数组下标为 s到m 和 m+1到t 两个部分
void merge(int arr[],int result[],int s,int m,int t)
{ //s是最左端,m是中间,t是最右端
int i = s; //i指向r[s~m]
int j = m+1; //j指向[m+1~t]
int k = s; // k指向result
while (i<=m && j<=t)
{
if (arr[i] < arr[j]) {
result[k++] = arr[i++]; //取r[i]和r[j]中小者放入result[k]中
} else
result[k++] = arr[j++];
}
while (i<=m)
{
result[k++] = arr[i++]; //这两个while处理有更多的数的那一部分
}
while (j<=t)
{
result[k++]=arr[j++];
}
}
void merge_sort(int arr[],int result[],int left,int right)
{
if(left==right)
result[left]=arr[right];
else
{
int temp[11]; //辅助数组
int mid=(left+right)/2; //把数组平分
merge_sort(arr,temp,left,mid); //递归将将arr[left~mid]归并为temp[left~mid]
merge_sort(arr,temp,mid+1,right);//递归将将arr[mid~right]归并为temp[mid~right]
merge(temp,result,left,mid,right);//递归将将temp[left~mid]和temp[mid~right]归并为result[left~right]
}
}
int main()
{
int arr[11] = { 9,1,3,5,9,8,7,6,2,4,1 };
int result[11];
merge_sort(arr,result, 0, 10);
for (int i = 0; i < 11; i++)
{
cout << arr[i] << " ";
}
cout<<endl;
for (int i = 0; i < 11; i++)
{
cout<<result[i]<<" ";
}
}