排序算法归纳
注:某些算法来源书籍或互联网,非本人发明,此贴仅作为笔记
/* topic:排序算法合集
* time:2020/6/26
*/
#include<iostream>
#include<algorithm>
#define MAX 0x7FFFFFFF
using namespace std;
void bubblesort();
void mergesort();
void MERGE(int a[],int p,int q,int r);
void merge_sort(int q[], int l, int r);
void shell_sort(int a[],int size);
int main()
{
int a[10]={2,3,2,6,9,8,4,5,7,4};
//quick_s(a,0,9);
//merge_sort(a,0,9);
shell_sort(a,10);
for(int i=0;i<10;i++)
cout<<a[i];
return 0;
}
//quik_sort 快排
void quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while (i < j)
{
do i ++ ; while (q[i] < x);
do j -- ; while (q[j] > x);
if (i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
//归并排序
void MERGESORT(int a[],int p,int r)
{
if(p<r)
{
int q = (p+r)/2;
MERGESORT(a,p,q);
MERGESORT(a,q+1,r);
MERGE(a,p,q,r);
}
}
void MERGE(int a[],int p,int q,int r)
{
int i,j,k;
int n1 = q-p+1;
int n2 = r-q;
int L[n1+1];
int R[n2+1];
for(i=0;i<n1;i++)
{
L[i] = a[p+i];
}
L[n1]=MAX;
for(i=0;i<n2;i++)
{
R[i]=a[q+i+1];
}
R[n2]=MAX;
i=j=0;
for( k=p;k<=r;k++)
{
if(L[i]<=R[j])
{
a[k]=L[i];
i++;
}
else
{
a[k]=R[j];
j++;
}
}
}
//单函数版归并排序
void merge_sort(int q[], int l, int r)
{
if (l >= r) return;
int mid = l + r >> 1;
merge_sort(q, l, mid);
merge_sort(q, mid + 1, r);//分牌过程
int tmp[200];
int k = 0, i = l, j = mid + 1;
while (i <= mid && j <= r)//放牌过程
if (q[i] < q[j]) tmp[k ++ ] = q[i ++ ];
else tmp[k ++ ] = q[j ++ ];
while (i <= mid) tmp[k ++ ] = q[i ++ ];//把剩下的牌也放进去
while (j <= r) tmp[k ++ ] = q[j ++ ];//把剩下的牌也放进去
for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];//赋值回去
}
//2020/9/11
//shell_sort
//希尔排序
void shell_sort(int a[],int size)
{
int N=size;
int h=1;
while(h<N/3)h=3*h+1;
while(h>=1)
{
for(int i=h;i<N;++i)
{
for(int j=i;j>=h&&(a[j]<a[j-h]);j-=h)
{
int tmp=a[j-h];
a[j-h]=a[j];
a[j]=tmp;
}
}
h=h/3;
}
}