堆排序
时间复杂度:
Θ
(
n
l
g
n
)
Θ(nlgn)
Θ(nlgn)
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
/*向下调整以维持最大堆的性质*/
void siftdown(int a[], int x, int n)
{
int l, r, max, t;
while (x <= n / 2)
{
l = x * 2;
r = x * 2 + 1;
if (l <= n&&a[x] < a[l])
max = l;
else
max = x;
if (r <= n&&a[max] < a[r])
max = r;
if (max != x)
{
t = a[max];
a[max] = a[x];
a[x] = t;
x = max;
}
else
break;
}
return;
}
void heapsort(int a[], int x)
{
int t;
t = a[1];
a[1] = a[x];
a[x] = t;
siftdown(a, 1, x-1);
return;
}
void main()
{
int a[3200], i, n;
scanf("%d", &n);
for (i = 1; i <= n; i++)
scanf("%d", &a[i]);
/*建堆*/
for (i = n / 2; i > 0; i--)
siftdown(a, i, n);
/*排序*/
for (i = n; i > 0; i--)
heapsort(a, i);
/*输出*/
for (i = 1; i <= n; i++)
{
if (i % 40 == 0) printf("\n");
printf("%d ", a[i]);
}
getchar();
getchar();
}
优先队列
代码:
#define _CRT_SECURE_NO_WARNINGS
#define MAXN 3200;
#include<stdio.h>
#include<stdlib.h>
/*向下调整以维持最小堆的性质*/
typedef struct
{
int maxsize;
int size;
int *a;
} min_heap;
typedef min_heap* MinHeap;
void SiftDown(int a[], int x, int n)
{
int l, r, max, t;
while (x <= n / 2)
{
l = x * 2;
r = x * 2 + 1;
if (l <= n&&a[x] > a[l])
max = l;
else
max = x;
if (r <= n&&a[max] > a[r])
max = r;
if (max != x)
{
t = a[max];
a[max] = a[x];
a[x] = t;
x = max;
}
else
break;
}
return;
}
void SiftUp(int a[], int i, int x)
{
int t;
if (x > a[i])
{
printf("x is too big!\n");
return;
}
a[i] = x;
while (i > 1 && a[i / 2] > a[i])
{
t = a[i];
a[i] = a[i / 2];
a[i / 2] = t;
i = i / 2;
}
return;
}
MinHeap CreatHeap(int Maxsize)
{
MinHeap s;
s = (MinHeap)malloc(sizeof(min_heap));
s->maxsize = Maxsize;
s->size = 0;
s->a = (int*)malloc(sizeof(int)*Maxsize);
return s;
}
void Insert(MinHeap s, int x)
{
if (s->size == 0)
{
s->size++;
s->a[1] = x;
}
else
{
s->size++;
s->a[s->size] = MAXN;
SiftUp(s->a, s->size, x);
}
return;
}
int Min(MinHeap s)
{
if (s->size == 0)
{
printf("heap is empty!");
return -1;
}
else
return s->a[1];
}
int Pop(MinHeap s)
{
if (s->size == 0)
{
printf("heap is empty!");
return -1;
}
int ans = s->a[1];
s->a[1] = s->a[s->size];
s->size--;
SiftDown(s->a, 1, s->size);
return ans;
}
void Delete(MinHeap s, int x)
{
s->a[x] = MAXN;
SiftDown(s->a, x, s->size);
s->size--;
return;
}
void main()
{
MinHeap s;
s = CreatHeap(30000);
Insert(s, 5);
Insert(s, 3);
Insert(s, 62);
Insert(s, 44);
printf("%d\n", Min(s));
printf("%d\n", Pop(s));
printf("%d\n", Min(s));
Insert(s, 1);
printf("%d\n", Min(s));
getchar();
getchar();
}