- 23/8/06
- 10,237
- 3,728
Ai có cái thuật toán ShellSort với MergeSort cho mình xin miếng ?
Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
Ai có cái thuật toán ShellSort với MergeSort cho mình xin miếng ?
void ShellSort(int a[],int n, int h[], int k)
{ int step,i,j, x,len;
for (step = 0 ; step <k; step++)
{ len = h[step];
for (i = len; i<n; i++)
{
x = a[i];
j = i-len; // a[j] đứng kề trước a[i] trong cùng dãy con
while ((x<a[j])&&(j>=0)// sắp xếp dãy con chứa x
{ // bằng phương pháp chèn trực tiếp
a[j+len] = a[j];
j = j - len;
}
a[j+len] = x;
}
}
}
int b[MAX], c[MAX], nb, nc;
void MergeSort(int a[], int N)
{
int k;
for (k = 1; k < N; k *= 2)
{
Distribute(a, N, nb, nc, k);
Merge(a, nb, nc, k);
}
}
void Distribute(int a[], int N, int &nb, int &nc, int k)
{
int i, pa, pb, pc;
pa = pb = pc = 0;
while (pa < N)
{
for (i=0; (pa<N) && (i<k); i++, pa++, pb++)
b[pb] = a[pa];
for (i=0; (pa<N) && (i<k); i++, pa++, pc++)
c[pc] = a[pa];
}
nb = pb; nc = pc;
}
void Merge(int a[],int nb, int nc,int k)
{ int p, pb, pc, ib, ic, kb, kc;
p=pb=pc=0; ib=ic=0;
while((nb>0)&&(nc>0))
{ kb=min(k,nb); kc=min(k,nc);
if(b[pb+ib]<=c[pc+ic])
{ a[p++]=b[pb+ib]; ib++;
if(ib==kb)
{ for(;ic<kc;ic++ a[p++]=c[pc+ic];
pb+=kb; pc+=kc; ib = ic=0;
nb-=kb; nc-=kc;
}
}
else
{ a[p++]=c[pc+ic]; ic++;
if(ic==kc)
{
for(;ib<kb;ib++) a[p++]=b[pb+ib];
pb+=kb; pc+=kc; ib = ic=0;
nb-=kb; nc-=kc;
}
}
}
}
int min(int a,int b)
{
if(a>b) return b;
else return a;
}
<a href="index.php?pagetitle=lisgame">Listgame</a>
<?php
if($_GET['pagetitle']=='listgame')
{
include_once("listgame.php");
}
?>
Notice: Undefined index: pagetitle in E:\wamp\www\shopgame\index.php on line 22
Dùng QuickSort - sắp xếp phân hoạch. http://en.wikipedia.org/wiki/Quick_SortXin lỗi vì chen ngang thanhtungtnt nhưng mình có 1 bài toán về mảng 1 chiều: sắp xếp mảng sao cho các số dương đứng đầu mảng giảm dần, kế đến là các số âm tăng dần, sau cùng là các số 0. Thầy mình nói có nhiều cách làm. 1 cách là tách ra 3 mảng: âm, dương, 0. Xử lý trên từng mảng rồi gộp mảng lại. Nhưng cách này thì dài quá. Thầy nói có cách làm trực tiếp nhưng mình suy nghĩ hoài không ra. Ai giúp dùm mình. Thanks

Tất nhiên là chỉ máy mình thấy thôi.
Cảm ơn#include<stdio.h>
#include<conio.h>
void td(int &);
int i;
void td(int ia[])
{
int k,z;
while(ia[0]>=ia[1] ^ ia[i-2]>=ia[i-1] ^ ia[1]>=ia[i-1])
for(z=0;z<=i-1;z++)
if(ia[z]>=ia[z+1])
{
k=ia[z+1];
ia[z+1]=ia[z];
ia[z]=k;
}
printf("Tu nho den lon.\n");
for(z=0;z<=i-1;z++)
printf("%4d", ia[z]);
printf("\n");
printf("Tu lon den nho.\n");
for(z=i-1;z>=0;z=z-1)
printf("%4d", ia[z]);
}
void main()
{
clrscr();
printf("Nhap vao so luong so tu nhien can xep thu tu.\n");
scanf("%d", &i);
while(i<=1)
{
printf("Nhap so lon hon 1.\n");
scanf("%d", &i);
}
int ia[50],u;
for(u=0;u<=i-1;u++)
{
printf("Nhap vao so hang thu %d.\n", u+1);
scanf("%d", &ia[u]);
}
td(ia);
getch();
}
little trickier: sapxep(int array[], int n, SapXepType (tang,giam) )hàm sắp xếp tăng //void sapxep_tang(int arry[],int n)
- hàm sắp xếp giảm//void sapxep_giam(int arry[],int n)
