排序大全:
//直接選擇排序
void csort(int *a, int n)
{
int j =0;
int tmp1;
int tmp2;
int i;
for(i = 0; i<n; ++i){
tmp1 = i;
for(j =i+1; j<n; ++j){
if(a[tmp1] < a[j]) tmp1 = j;
}
tmp2 =a[i];
a[i] = a[tmp1];
a[tmp1] =tmp2;
}
return;
}
//直接插入排序
void insert_sort(int *a, int n)
{
int i ;
int j;
int tmp;
for(i =1;i< n;++i){
tmp = a[i];
for(j =i-1; j>=0; --j){
if(tmp < a[j]){
break;
}
a[j+1] = a[j];
}
++j;
a[j] = tmp;
}
return;
}
// 冒泡排序
void bubble_sort(int *a, int n)
{
int i;
int j;
int tmp;
for(i= n-1; i>=0; --i)
for(j = 0; j<i; ++j){
if(a[j] < a[j+1]){
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
return;
}
//shell 排序
//希爾排序
void shell_sort(int *a, int n)
{
int i;
int j;
int k;
int c;
int m;
int tmp;
for(c = 10; c>= 1; --c)
for(k = 0; k<c; ++k)
for(j = k+c; j < n; j += c){
tmp = a[j];
for(m = j-c; m>=0; m-=c){
if(tmp<a[m]){
break;
}
a[m+c] = a[m];
}
m += c;
a[m] = tmp;
}
return;
}
//歸併排序
void merge_sort(int *a ,int s,int e,int *v)
{
if(e == s) return;
merge_sort(a,s,(s+e)/2,v);
merge_sort(a,(s+e)/2+1,e,v);
int m = (s+e)/2;
int i =s;
int j =m+1;
int o =s;
while(i<=m && j<=e){
if(a[i] < a[j]){
v[o++] = a[j++];
}
else{
v[o++] = a[i++];
}
}
if(i>m && j<=e){
for(;j<=e;++j){
v[o++] = a[j];
}
}
else if(j>e && i<=m){
for(;i<=m;++i){
v[o++] = a[i];
}
}
for(int i= s; i<=e; ++i){
a[i] = v[i];
}
}
//堆排序
void heap_sort(int *a, int n)
{
int f; //father
int l; // left chilr
int r; //rught child
int ff; //father
int ll; // left chilr
int rr; //rught child
int t; //tmp
int tt; //tmp
int which_c; //which child
int m ; // len when delete
//build a heap
f = (n)/2;
while(f>=1){
l = 2*f;
r = 2*f+1;
which_c = f;
t = a[f-1];
if(l <= n && t < a[l-1]){
t = a[l-1];
which_c = l;
}
if(r <= n && t< a[r-1]){
t = a[r-1];
which_c = r;
}
a[which_c -1] = a[f-1];
a[f-1] = t;
ff = which_c;
while(ff <= n/2){
ll = 2*ff;
rr = 2*ff+1;
which_c = ff;
tt = a[ff-1];
if(ll<=n && tt< a[ll-1]){
tt = a[ll-1];
which_c = ll;
}
if(rr <= n && tt< a[rr-1]){
tt = a[rr-1];
which_c = rr;
}
if(which_c == ff) break;
else{
a[which_c -1] = a[ff-1];
a[ff-1] = tt;
ff =which_c;
}
}
--f;
}
for(int i =0 ;i<n; ++i){
cout<<a[i]<<' ';
}
cout<<endl;
//delete the node
for(tt = 0;tt< n; ++tt){
t = a[n-1-tt];
a[n-1-tt] = a[0];
a[0] = t;
f = 1;
m = n-tt-1;
while(f <= m/2){
l = 2*f;
r = 2*f+1;
which_c = f;
t = a[f-1];
if(l <= m && t< a[l-1]){
t = a[l-1];
which_c = l;
}
if(r <= m && t< a[r-1]){
t = a[r-1];
which_c = r;
}
if(which_c == f) break;
else{
a[which_c -1] = a[f-1];
a[f-1] = t;
f =which_c;
}
}
}
}
//堆排序就是一個建立堆與刪除堆的過程
//快速排序
void quicksort(int *a, int s, int e)
{
int i;
int j;
int m;
int k;
int tmp;
int base;
if(s>=e) return;
i = s+1;
j = e;
base = a[s];
while(j>=i){
while(a[i]<=base && i<=j)++i;
while(a[j]> base && j>=i)--j;
if(i==j){
if(a[i] > base)--i;
break;
}
else if(i+1 ==j){
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
break;
}
else if(i>j){
i = j;
break;
}
else{
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
++i;
--j;
}
}
tmp = a[s];
a[s] = a[i];
a[i] = tmp;
quicksort(a,s,i-1);
quicksort(a,i+1,e);
}