#include
typedef int bool;
#define true 1
#define false 0
void swap(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}
void bubbleSort(int *a, int left, int right)
{
bool cond = true;
int i;
for (i = left; i < right; ++i)
{
cond = false;
int j;
for (j = right; j > i; --j)
if (a[j] < a[j - 1])
{
swap(&a[j], &a[j - 1]);
cond = true;
}
if (!cond)
return;
}
}
void selectSort(int *a, int left, int right)
{
int minPos;
int i;
for (i = left; i < right; ++i)
{
minPos = i;
int j;
for (j = i + 1; j <= right; ++j)
if (a[j] < a[minPos])
minPos = j;
if (i != minPos)
swap(&a[i], &a[minPos]);
}
}
void insertSort(int *a, int left, int right)
{
int p;
for (p = left + 1; p <= right; p++)
{
int tmp = a[p];
int j;
for (j = p; j > left
&& tmp < a[j - 1];
--j)
a[j] = a[j - 1];
a[j] = tmp;
}
}
int median3(int *a, int left, int right);
void quickSort(int *a, int left, int right)
{
if (left + 20 <= right)
{
int pivot = median3(a, left, right);
// begin partitioning
int i = left, j = right - 1;
for (;;)
{
while (a[++i] < pivot)
{
}
while (pivot < a[--j])
{
}
if (i < j)
swap(&a[i], &a[j]);
else
break;
}
// Restore pivot
swap(&a[i], &a[right -
1]);
// Sort small elements
quickSort(a, left, i - 1);
// Sort large elements
quickSort(a, i + 1, right);
}
else
insertSort(a, left, right);
}
int median3(int *a, int left, int right)
{
int center = (left + right) / 2;
if (a[center] < a[left])
swap(&a[left],
&a[center]);
if (a[right] < a[left])
swap(&a[left],
&a[right]);
if (a[right] < a[center])
swap(&a[center],
&a[right]);
swap(&a[center], &a[right -
1]);
return a[right - 1];
}
void merg(int *a, int left1, int right1, int left2, int
right2);
void mergSort(int *a, int left, int right)
{
int left1, right1, left2, right2, n = right - left + 1, size =
1;
while (size < n)
{
left1 = left;
while (left1 + size < n)
{
left2 = left1 + size;
right1 = left2 - 1;
if (left2 + size > n)
right2 = right;
else
right2 = left2 + size - 1;
merg(a, left1, right1, left2, right2);
left1 = right2 + 1;
}
size *= 2;
}
}
void merg(int *a, int left1, int right1, int left2, int
right2)
{
int k = 0, i = left1, j = left2, n1 = right1 - left1 + 1, n2 =
right2
- left2 + 1;
int tmp[n1 + n2];
while (i <= right1
&& j <=
right2)
if (a[i] < a[j])
tmp[k++] = a[i++];
else
tmp[k++] = a[j++];
while (i <= right1)
tmp[k++] = a[i++];
while (j <= right2)
tmp[k++] = a[j++];
for (i = 0; i < n1; ++i)
a[left1++] = tmp[i];
for (i = 0; i < n2; ++i)
a[left2++] = tmp[n1 + i];
//delete []tmp;
}
void filterDown(int *a, int i, int n);
void heapSort(int *a, int left, int right)
{
int n = right - left + 1;
int tmp[n];
int i;
for (i = 0; i < n; ++i)
tmp[i] = a[left + i];
for (i = n / 2; i >= 0; --i)
filterDown(tmp, i, n);
int j;
for (j = n - 1; j > 0; --j)
{
swap(&tmp[0], &tmp[j]);
filterDown(tmp, 0, j);
}
for (i = 0; i < n; ++i)
a[left + i] = tmp[i];
}
void filterDown(int *a, int i, int n)
{
int child;
int tmp;
for (tmp = a[i]; 2 * i + 1 < n; i =
child)
{
child = 2 * i + 1;
if (child != n - 1 && a[child]
< a[child + 1])
child++;
if (tmp < a[child])
a[i] = a[child];
else
break;
}
a[i] = tmp;
}
int main()
{
int d[] =
{ 7, 5, 6, 4, 2, 3, 1, 9, 8 };
int n;
for (n = 0; n < sizeof(d) / sizeof(int);
n++)
printf("%d", d[n]);
printf("\n");
int opt = 0;
printf("1 bubbleSort\n");
printf("2 selectSort\n");
printf("3 insertSort\n");
printf("4 quickSort\n");
printf("5 mergSort\n");
printf("6 heapSort\n");
printf("option:");
scanf("%d",&opt);
printf("\n");
switch (opt)
{
case 1:
bubbleSort(d, 0, 9);
break;
case 2:
selectSort(d, 0, 9);
break;
case 3:
insertSort(d, 0, 9);
break;
case 4:
quickSort(d, 0, 9);
break;
case 5:
mergSort(d, 0, 9);
break;
case 6:
heapSort(d, 0, 9);
break;
default:
printf("input error!\n");
exit(1);
}
for (n = 0; n < sizeof(d) / sizeof(int);
n++)
printf("%d", d[n]);
}