Добавил:
alex20000
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:sem6_3
.c#include <stdio.h>
#define SWAP(type, a, b) {type tmp = a; a = b; b=tmp;}
struct bound
{
int left;
int right;
};
void qsort(int* arr, int len)
{
int left = 0;
int right = len - 1;
int mid;
struct bound stack[512];
int stack_pos = 0;
int i, j;
stack[1].left = left;
stack[1].right = right;
stack_pos++;
/*do
{
for(int q = 0; q != len; ++q)
printf("%d|", arr[q]);
putchar('\n');
left = stack[stack_pos].left;
right = stack[stack_pos].right;
stack_pos--;
int mid = (right + left) / 2;
i = left;
j = right;
while(i < j)
{
while(arr[i] < arr[mid])
i++;
while(arr[j] > arr[mid])
j--;
if(i < j)
{
SWAP(int, arr[i], arr[j]);
i++;
j--;
}
}
if(j != i)
{
stack[stack_pos].left = i;
stack[stack_pos].right = right;
stack_pos++;
stack[stack_pos].left = left;
stack[stack_pos].right = j;
stack_pos++;
}
else
{
if((right - i) >= (j - left))
{
stack[stack_pos].left = i + 1;
stack[stack_pos].right = right;
stack_pos++;
stack[stack_pos].left = left;
stack[stack_pos].right = j;
stack_pos++;
}
else
{
stack[stack_pos].left = i;
stack[stack_pos].right = right;
stack_pos++;
stack[stack_pos].left = left;
stack[stack_pos].right = j - 1;
stack_pos++;
}
}
}while(stack_pos != 0);*/
do
{
left = stack[stack_pos].left;
right = stack[stack_pos].right;
stack_pos--;
do
{
mid = (left + right) / 2;
i = left;
j = right;
do
{
while (arr[i] < arr[mid])
i++;
while (arr[j] > arr[mid])
j--;
if(i <= j)
{
SWAP(int, arr[i], arr[j]);
i++;
j--;
}
}while (i <= j);
if (i < mid)
{
if (i < right)
{
stack_pos++;
stack[stack_pos].left = i;
stack[stack_pos].right = right;
}
right = j;
}
else
{
if(j > left)
{
stack_pos++;
stack[stack_pos].left = left;
stack[stack_pos].right = j;
}
left = i;
}
}while (left < right);
}while(stack_pos != 0);
}
int main()
{
int arr[] = {9, 3, 5, 2, 4};
qsort(arr, 5);
for(int q = 0; q != 5; ++q)
printf("%d|", arr[q]);
putchar('\n');
return 0;
}
Соседние файлы в предмете Информатика