//待排序元素 存储在0~L.length-1 之中
#define MAX 10000
typedef int Eletype;
typedef struct
{
Eletype a[MAX];
int length;
}Sqlist;
Eletype num[MAX];
// 插入 排序 O(n^2)
void insert_sort(Sqlist &L)
{
for(int i=1; i<L.length; i++)
{
Eletype tmp=L.a[i];
int j;
for(j=i; j>0; j--)
{
if(tmp < L.a[j-1]) L.a[j]=L.a[j-1];
else break;
}
L.a[j]=tmp;
}
}
//希尔排序 增量为dlta[k]=2^(t-k+1) -1时, 为O(n^(3/2)) 1<=k<=t<=ln(n+1)
void shell_insert(Sqlist &L, int dk)
{
for(int i=dk; i<L.length; i++)
{
Eletype tmp=L.a[i];
int j;
for(j=i; j-dk>=0; j-=dk)
{
if(tmp < L.a[j-dk]) L.a[j]=L.a[j-dk];
else break;
}
L.a[j]=tmp;
}
}
void shell_sort(Sqlist &L)
{
int dlta[10000],t;
t=100;
for(int i=0; i<t; i++) dlta[i]=(1<<(t-i+1) ) -1;//此增量的设置忽略(随意设置的)
for(int k=0; k<t; k++) shell_insert(L, dlta[k]);
}
//冒泡排序 O(n^2)
void bubble_sort(Sqlist &L)
{
for(int i=1; i<L.length; i++)
{
for(int j=0; j<L.length-i; j++)
if(L.a[j] > L.a[j+1]) swap(L.a[j], L.a[j+1]);
}
}
//选择排序 O(n^2)
void select_sort(Sqlist &L)
{
for(int i=0; i<L.length; i++)
{
int j=i;
for(int k=i+1; k<L.length; k++)
{
if(L.a[k]<L.a[j]) j=k;
}
if(j!=i) swap(L.a[i], L.a[j]);
}
}
//快速排序 O(n*ln(n))
int partition(Sqlist &L, int low, int high)
{
Eletype tmp=L.a[low];
while(low<high)
{
while(low<high && L.a[high]>=tmp) high--;
L.a[low]=L.a[high];
while(low<high && L.a[low]<=tmp) low++;
L.a[high]=L.a[low];
}
L.a[low]=tmp;
return low;
}
void quick_sort(Sqlist &L, int low, int high)
{
if(low>=high) return ;
int tmp=partition(L, low, high);
quick_sort(L, low, tmp-1);
quick_sort(L, tmp+1, high);
}
//归并排序 O(n*ln(n))
void Merge(Sqlist &L, int l,int m,int r)
{
int k=0,i,j;
for(i=l, j=m+1; i<=m && j<=r; k++)
{
if(L.a[i]<L.a[j]) num[k]=L.a[i++];
else num[k]=L.a[j++];
}
if(i<=m) memcpy(num+k, L.a+i, (m-i+1)*sizeof(Eletype));
if(j<=r) memcpy(num+k, L.a+j, (r-j+1)*2*sizeof(Eletype));
memcpy(L.a+l, num, (r-l+1)*sizeof(Eletype));
}
void Msort(Sqlist &L,int l, int r)
{
if(l>=r) return ;
int m=(l+r)>>1;
Msort(L, l,m);
Msort(L, m+1, r);
Merge(L, l, m, r);
}
//堆排序 O(n*ln(n))
void heapadjust(Sqlist &L, int l,int r)
{
Eletype tmp=L.a[l-1];
for(int j=2*l; j<=r; j*=2)
{
if(j<r && L.a[j-1]<L.a[j]) j++;
if(tmp>L.a[j-1]) break;
L.a[l-1]=L.a[j-1]; l=j;
}
L.a[l-1]=tmp;
}
void heap_sort(Sqlist &L)
{
for(int i=L.length/2; i>0; i--)
heapadjust(L, i, L.length);
for(int i=L.length; i>1; i--)
{
swap(L.a[0], L.a[i-1]);
heapadjust(L, 1, i-1);
}
}
void display(Sqlist L)
{
printf("%d", L.a[0]);
for(int i=1; i<L.length; i++) printf(" %d", L.a[i]);
puts("");
}
几种常见的排序算法
最新推荐文章于 2024-07-16 20:27:00 发布