PDA

View Full Version : Sắp xếp mảng bằng quicksort



Sess_Kakashi
16-11-2008, 10:38
Mình đang viết chương trình để sắp xếp mảng bằng quicksort, khi chạy thử thì nó không có báo lỗi nhưng chương trình lại kô chạy ra gì cả. Mong mọi người giúp đỡ . Thanks


#include<stdio.h> //khai bao thu vien
#include<conio.h>
#include<stdlib.h>
#define MAX 10000
char *input="day_so.inp";
float a[MAX];
int n;
void qs(int l,int r)
{
float tg;
float pivot;
int i,j;
if(l<r)
{
randomize();
i=l;
j=r;
pivot=a[random(r-l+1)+1];
do
{
while(a[i]<pivot)i++;
while(a[j]>pivot)j--;
if(i<=j)
{
tg=a[i];
a[i]=a[j];
a[j]=tg;
i++;
j--;
}
}
while(i<=j);
qs(l,j);
qs(l,r);
}
}
void main()
{
clrscr();
int i;
FILE*f;
//doc du lieu tu FILE *//
f=fopen(input,"r");
fscanf(f,"%d",&n);
for(i=0;i<n;i++)
fscanf(f,"%f",&a[i]);
fclose(f);
qs(0,n-1);
//in ra ket qua//
printf("mang sau khi sap xep la:");
for(i=0;i<=n-1;i++)
printf("%f",a[i]);
getch();
}

tppdua
17-11-2008, 21:36
//qs(l,r);
phải là qs(i,r) chứ

Pluto19
18-11-2008, 22:55
Mẹ !!! sai là cái chắc rồi.
[CODE]
..............................................
Procedure QuickSort(Var l,r:integer);
Var pos: integer;
Begin
If l < r then
Begin
Pos:= Split(l,r);
QuickSort(l,pos-1);
QuickSort(pos+1,r);
End;
End;
...........................
Procedure Split(Var low,high :integer);
Var left,right :integer;item:datatype;
Begin
Item:=x[low];
Left:=Low;
Right:=high;
While left <right do
Begin
While x[right]> item do
Right:=right –1;
While (left <right) and x[left]<=item)
do
Left:=left +1;
If (left <right) then
Permute (X[left],x[right])
Pos:=Right;
End;
End;
....................................[CODE]
Ông tự xem code này là hiểu thôi

blue_ndt
19-11-2008, 21:16
Bố khỉ,ông kia đang hỏi C ông này lôi ngôn ngữ khác vô thì biết sai chỗ nào mà sửa.

[=========> Bổ sung bài viết <=========]


#include <stdio.h>
#include <conio.h>
#define MAX 100
void swap(int *x,int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
int getkeyposition(int i,int j )
{
return((i+j) /2);
}
void qsort(int list[],int m,int n)
{
int key,i,j,k;
if( m < n)
{
k = getkeyposition(m,n);
swap(&list[m],&list[k]);
key = list[m];
i = m+1;
j = n;
while(i <= j)
{
while((i <= n) && (list[i] <= key))
i++;
while((j >= m) && (list[j] > key))
j--;
if( i < j)
swap(&list[i],&list[j]);
}
swap(&list[m],&list[j]);
qsort(list,m,j-1);
qsort(list,j+1,n);
}
}
void readlist(int list[],int n)
{
int i;
printf("Nhap cac phan tu cho mang\n");
for(i=0;i<n;i++)
scanf("%d",&list[i]);
fflush(stdin);
}
void printlist(int list[],int n)
{
int i;
printf("Cac phan tu trong mang: \n");
for(i=0;i<n;i++)
printf("%d\t",list[i]);
printf("\n");
}

void main()
{
int list[MAX], n;
printf("Nhap so phan tu cho mang, lon nhat = 100\n");
scanf("%d",&n);
readlist(list,n);
printf("Cac phan tu da nhap:\n");
printlist(list,n);
qsort(list,0,n-1);
printf("\nCac phan tu da sap xep:\n");
printlist(list,n);
getch();
}