/*****************************************************************************
* sort.c
*
* Implementation for sort algorithms.
*
* Qch, 2011-05
*****************************************************************************/
#include<stdio.h>
#include<stdlib.h>
typedef int bool;
#define true 1
#define false 0
void swap(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}
/**
* Bubble sort algorithm.
* "a" ----> array of Comparable items.
* "left" ----> the left-most index of the subarray.
* "right" ----> the right-most index of the subarray.
*/
void bubbleSort(int *a, int left, int right)
{
bool cond = true;
int i,j;
for (i = left; i < right; ++i)
{
cond = false;
for (j = right; j > i; --j)
if (a[j] < a[j - 1])
{
swap(&a[j], &a[j - 1]);
cond = true;
}
if (!cond)
return;
}
}
/**
* Selection sort algorithm.
* "a" ----> array of Comparable items.
* "left" ----> the left-most index of the subarray.
* "right" ----> the right-most index of the subarray.
*/
void selectSort(int *a, int left, int right)
{
int minPos;
int i,j;
for (i = left; i < right; ++i)
{
minPos = i;
for (j = i + 1; j <= right; ++j)
if (a[j] < a[minPos])
minPos = j;
if (i != minPos)
swap(&a[i], &a[minPos]);
}
}
/**
* Insertion sort algorithm.
* "a" ----> array of Comparable items.
* "left" ----> the left-most index of the subarray.
* "right" ----> the right-most index of the subarray.
*/
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;
}
}
/**
* Internal quicksort method that makes recursive calls.
* Uses median-of-three partitioning and a cutoff of 20.
* "a" ----> array of Comparable items.
* "left" ----> the left-most index of the subarray.
* "right" ----> the right-most index of the subarray.
*/
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);
}
/**
* Return median of left, center, and right.
* Order these and hide the pivot.
*/
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];
}
/**
* Merg sort algorithm (nonrecursion).
* "a" ----> array of Comparable items.
* "start" ----> the left-most index of the subarray.
* "end" ----> the right-most index of the subarray.
*/
void merge(int *a,int start, int mid, int end);
void mergSort(int *a,int start, int end)
{
int mid;
if (start < end) {
mid = (start + end) / 2;
//printf("sort (%d-%d, %d-%d) %d %d %d %d %d %d %d %d\n",
// start, mid, mid+1, end,
// a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
mergSort(a,start, mid);
mergSort(a,mid+1, end);
merge(a,start, mid, end);
//printf("merge (%d-%d, %d-%d) to %d %d %d %d %d %d %d %d\n",
// start, mid, mid+1, end,
// a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
}
}
/**
* Merg two subsequence to a bigger one.
* The first subsequence is a[start] ... a[mid-1], and
* The second subsqeuence is a[mid] ... a[end].
*/
void merge(int *a,int start, int mid, int end)
{
int n1 = mid - start + 1;
int n2 = end - mid;
//int left[n1], right[n2];
int *left=(int *)malloc(n1*sizeof(int));
int *right=(int *)malloc(n2*sizeof(int));
int i, j, k;
for (i = 0; i < n1; i++) /* left holds a[start..mid] */
left[i] = a[start+i];
for (j = 0; j < n2; j++) /* right holds a[mid+1..end] */
right[j] = a[mid+1+j];
i = 0;
j = 0;
k = start;
while (i < n1 && j < n2)
if (left[i] < right[j])
a[k++] = left[i++];
else
a[k++] = right[j++];
while (i < n1) /* left[] is not exhausted */
a[k++] = left[i++];
while (j < n2) /* right[] is not exhausted */
a[k++] = right[j++];
free(left);
free(right);
}
/**
* Heap sort algorthm.
* "a" ----> array of Comparable items.
* "left" ----> the left-most index of the subarray.
* "right" ----> the right-most index of the subarray.
*/
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 *tmp=(int *)malloc(n*sizeof(int));
int i,j;
for (i = 0; i < n; ++i)
tmp[i] = a[left + i];
for (i = n / 2; i >= 0; --i)
filterDown(tmp, i, n);
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];
free(tmp);
}
/**
* Percolate down the heap.
* "i" ----> the position from which to percolate down.
* "n" ----> the logical size of the binary heap.
*/
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 j ;
int d[] ={ 7, 5, 6, 4, 2, 3, 1, 9, 8 };
int n,opt=0;
for (n = 0; n <sizeof(d) / sizeof(int); n++)
printf("%4d", d[n]);
printf("\n");
//int opt = 0;
begin:
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:");
j= scanf("%d",&opt);
printf("\n");
if(j==1&&getchar()=='\n')
switch (opt)
{
case 1:
bubbleSort(d, 0, 9);
for (n = 1; n <= sizeof(d) / sizeof(int); n++)
printf("%4d", d[n]);
printf("\n");
break;
case 2:
selectSort(d, 0, 9);
for (n = 1; n <= sizeof(d) / sizeof(int); n++)
printf("%4d", d[n]);
printf("\n");
break;
case 3:
insertSort(d, 0, 9);
for (n = 1; n <= sizeof(d) / sizeof(int); n++)
printf("%4d", d[n]);
printf("\n");
break;
case 4:
quickSort(d, 0, 9);
for (n = 1; n <= sizeof(d) / sizeof(int); n++)
printf("%4d", d[n]);
printf("\n");
break;
case 5:
mergSort(d, 0, 9);
for (n = 1; n <= sizeof(d) / sizeof(int); n++)
printf("%4d", d[n]);
printf("\n");
break;
case 6:
heapSort(d, 0, 9);
for (n = 1; n <= sizeof(d) / sizeof(int); n++)
printf("%4d", d[n]);
printf("\n");
break;
default:
printf("input error!\n");
goto begin;
// exit(1);
}
/*
for (n = 0; n < sizeof(d) / sizeof(int); n++)
printf("%4d", d[n]);
printf("\n");
*/
// }
else{
printf("this input is error!\n");
while(getchar()!='\n');
goto begin;
}
return 0;
}