希尔排序:
#include <stdio.h>
#include <stdlib.h>
int a[10010];
int b[10010];
void shellsort1(int a[], int n)
{
int d, i, j, t;
d = n/2;
for(i = d; i < n; i++)
{
for(j =i-d; j >= 0; j-= d)
{
if(a[j] > a[j+d])
{
t = a[j]; a[j] = a[j+d]; a[j+d] = t;
}
}
}
}
void shellsort2(int a[], int n)
{
int d, i, j, t;
d = 1;
for(i = d; i < n; i++)
{
for(j =i-d; j >= 0; j-= d)
{
if(a[j] > a[j+d])
{
t = a[j]; a[j] = a[j+d]; a[j+d] = t;
}
}
}
}
int main()
{
int n;
while(~scanf("%d", &n))
{
int i;
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
b[i] = a[i];
}
shellsort1(a, n);
for(i = 0; i < n;i++)
{
printf("%d%c", a[i], i == n-1 ? '\n' : ' ');
}
shellsort2(b, n);
for(i = 0; i < n;i++)
{
printf("%d%c", b[i], i == n-1 ? '\n' : ' ');
}
}
return 0;
}
归并排序:
#include <stdio.h>
#include <stdlib.h>
int a[100010], b[100010];
long long int sum;
void merge(int s1, int e1, int s2, int e2)
{
int i = 0;
int p1 = s1, p2 = s2;
while(p1 <= e1 && p2<= e2)
{
if(a[p1] <= a[p2])
{
b[i++] = a[p1++];
}
else
{
b[i++] = a[p2++];
sum+= e1-p1+1;
}
}
while(p1<=e1)
{
b[i++] = a[p1++];
}
while(p2<=e2)
{
b[i++] = a[p2++];
}
int j;
for(j = s1; j <= e2; j++)
{
a[j] = b[j-s1];
}
}
void merge_sort(int s, int e)
{
int mid;
if(s < e)
{
mid = (s+e)/2;
merge_sort(s, mid);
merge_sort(mid+1, e);
merge(s, mid, mid+1, e);
}
}
int main()
{
int n, i;
scanf("%d", &n);
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
sum = 0;
merge_sort(0, n - 1);
printf("%lld\n", sum);
return 0;
}
交叉排序:
#include <stdio.h>
#include <stdlib.h>
void qs1(int a[], int l, int r)
{
int key = a[l], i = l, j = r;
if(l >= r) return ;
while(i < j)
{
while(i < j && a[j] >= key) j--;
a[i] = a[j];
while(i < j && a[i] <= key) i++;
a[j] = a[i];
}
a[i] = key;
qs1(a, l, i-1);
qs1(a, i+1, r);
}
void qs2(int a[], int l, int r)
{
int key = a[l], i = l, j = r;
if(l >= r) return ;
while(i < j)
{
while(i < j && a[j] <= key) j--;
a[i] = a[j];
while(i < j && a[i] >= key) i++;
a[j] = a[i];
}
a[i] = key;
qs2(a, l, i-1);
qs2(a, i+1, r);
}
int main()
{
int n, i, a[110], j, k;
int odd[110], even[110];
scanf("%d", &n);
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
j = 0;
k = 0;
for(i = 0; i < n; i++)
{
if(i % 2 == 0)
odd[j++] = a[i];
else even[k++] = a[i];
}
qs1(odd, 0, j-1);
qs2(even, 0, k-1);
if(j > k)
{
for(i = 0; i < k; i++)
{
printf("%d %d ", odd[i], even[i]);
}
printf("%d\n", odd[j-1]);
}
else if(k > j)
{
for(i = 0; i < j; i++)
{
printf("%d %d ", odd[i], even[i]);
}
printf("%d\n", even[k-1]);
}
else
{
for(i = 0; i < j; i++)
{
printf("%d %d%c", odd[i], even[i], i == j - 1? '\n' : ' ');
}
}
return 0;
}