1)顺序表选择排序
void ss_sort(int e[], int n)
{
int i,j,k,t;
for(i=0; i<n-1; i++)
{
for(k=i, j=i+1; j<n; j++)
{
if( e[k] > e[j] )
k=j;
}
if(k!=i)
{
t=e[i]; e[i]=e[k]; e[k]=t;
}
}
}
选择排序 共比较n(n-1)/2次, 不稳定排序,如果相等的数,可能交换位置。
1-1) 堆排序
渗透函数
void sift(int e[], int n, int s)
{
int t,k,j;
t = e[s];
k=s;
j = 2*k +1;
while(j<n)
{
if(j<n-1 && e[j]<e[j+1])
j++;
if(t<e[j])
{
e[k]=e[j];
k=j;
j=2*k+1;
}
else
break;
}
e[k]= t;
}
void heapsort(int e[], int n)
{
int i,k,t;
for(i=n/2-1; i>=0; i--)
{
sift(e,n,i);
}
for(k=n-1; k>=1; k--)
{
t=e[0];
e[0]=e[k];
e[k]=t;
sift(e,k,0);
}
}
2)顺序表直接插入排序
void insert_sort(int e[],int n)
{
int i,j;
int temp;
for(i=1; i<n; i++)
{
temp = e[i];
j =i ;
while( j>0 && temp>e[j-1])
{
e[j] = e[j-1];
j--;
}
e[j] = temp;
}
}
直接插入排序 比较次数最少为n-1次, 最多为n(n-1)/2次,稳定排序
对与原来排好的序列排序效率高
2-1) 希尔排序
void shell(int e[], int n)
{
int j, k, h, y;
for(h=n/2; h>0; h=h/2)
{
for(j=h; j<n; j++)
{
y= e[j];
for(k=j-h; k>=0 && y<e[k] ; k-=h)
{
e[k+h] = e[k];
}
e[k+h] = y;
}
}
}
3)冒泡排序
void mp_sort(int e[], int n)
{
int j,p,h,t;
for(h=n-1; h>0; h=p)
{
for(p=j=0; j<h; j++)
{
if(e[j]>e[j+1])
{
t = e[j];
e[j]=e[j+1];
e[j+1]= t;
p = j;
}
}
}
}
4)快速排序
void r_quick(int e[], int low, int high)
{
int i, j, t;
if(low<high)
{
i =low; j = high; t= e[low];
while(i<j)
{
while(i<j && e[j]>t ) j--;
if(i<j)
e[i++]=e[j];
while(i<j && e[i]<=t) i++;
if(i<j)
e[j--]=e[i];
}
e[i]=t;
r_quick(e,low, i-1);
r_quick(e,i+1,high);
}
}