Welcome to Scribd, the world's digital library. Read, publish, and share books and documents. See more
Standard view
Full view
of .
0 of .
Results for:
P. 1
SortDungConTroHam

# SortDungConTroHam

Ratings: (0)|Views: 386|Likes:

### Availability:

See more
See less

06/18/2011

pdf

text

original

C:\Users\Little_Chick\Desktop\Desktop\sort UTF8.cppSaturday, June 18, 2011 11:08 PM
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>/*-------------------------------------------------------*/voidquicksort
(
void
*
a
,
intn
,
intrecsize
,
int
(*
compare
)(
const void
*,
const void
*));
voidmergesort
(
void
*
a
,
intn
,
intrecsize
,
int
(*
compare
)(
const void
*,
const void
*));
void
*
binarysearch
(
const void
*
key
,
const void
*
a
,
intn
,
intrecsize
,
int
(*
compare
)(
const void
*,
const void
*));
voidswap
(
void
*
a
,
void
*
b
,
intrecsize
);
/*-------------------------------------------------------*///Comparison Functions/*-------------------------------------------------------*/intint_decrease
(
const void
*
a
,
const void
*
b
);
intabs_int_increase
(
const void
*
a
,
const void
*
b
);
/*-------------------------------------------------------*/intmain
(
void
){
printf
(
"Nhap so luong phan tu: "
);
intn
,
i
;
scanf
(
"%d"
, &
n
);
printf
(
"Nhap cac phan tu:\n"
);
int
*
a
= (
int
*)
malloc
(
n
*sizeof(
int
));for(
i
=
0
;
i
<
n
;
i
++)
scanf
(
"%d"
, &
a
[
i
]);
quicksort
(
a
,
n
,sizeof(
a
[
0
]),
int_decrease
);
printf
(
"Sau khi sap xep:\n"
);for(
i
=
0
;
i
<
n
;
i
++)
printf
(
"%6d"
,
a
[
i
]);
putchar
(
'\n'
);
printf
(
"Nhap phan tu de tim: "
);
intk
;
scanf
(
"%d"
, &
k
);
void
*
b
=
bsearch
(&
k
,
a
,
n
,sizeof(
a
[
0
]),
int_decrease
);if(
b
!=NULL)
printf
(
"Tim thay du lieu o vi tri %d\n"
, (
int
*)
b
-
a
);else
printf
(
"Khong tim thay du lieu.\n"
);
free
(
a
);return
0
;}
//Comparison Functions cung cấp cho quicksort(), mergesort() và binarysearch().//Giá trị trả về.
// > 0: a > b.// = 0: a = b.
-1-

C:\Users\Little_Chick\Desktop\Desktop\sort UTF8.cppSaturday, June 18, 2011 11:08 PM
// < 0: a < b./*-------------------------------------------------------*/intint_decrease
(
const void
*
a
,
const void
*
b
){return(*(
int
*)
b
- *(
int
*)
a
);}
//Nếu a < b => Giá trị trả về > 0 => Sắp xếp giảm dần.
intabs_int_increase
(
const void
*
a
,
const void
*
b
){return(
abs
(*(
int
*)
a
) -
abs
(*(
int
*)
b
));}
//Nếu |a| > |b| => Giá trị trả về > 0 => Sắp xếp tăng dần theo trị tuyệt đối.
/*-------------------------------------------------------*/
//Sắp xếp mảng các phần tử thuộc 1 kiểu dữ liệu bất kì (int, char**, struct, v.v...) bằng thuật
toán Quick Sort.
//a: con trỏ đến phần tử đầu tiên của mảng (Base Address).//n: số lượng phần tử trong mảng (Number of Elements).//recsize: kích thước từng phần tử, tính bằng byte (Element Width).//compare: con trỏ đến hàm chứa cách so sánh (Comparison Function).
voidquicksort
(
void
*
a
,
intn
,
intrecsize
,
int
(*
compare
)(
const void
*,
const void
*)){if(
n
<=
1
)return;
intleft
(
0
),
right
(
n
-
1
);
intmid
=
left
+ (
right
-
left
) /
2
;
void
*
pivot
=
malloc
(
recsize
);
memcpy
(
pivot
, (
char
*)
a
+
mid
*
recsize
,
recsize
);while(
left
<=
right
){while(
compare
(
pivot
, (
void
*)((
char
*)
a
+
left
*
recsize
)) >
0
)++
left
;while(
compare
((
void
*)((
char
*)
a
+
right
*
recsize
),
pivot
) >
0
)--
right
;if(
left
<=
right
){if(
left
<
right
)
swap
((
void
*)((
char
*)
a
+
left
*
recsize
), (
void
*)((
char
*)
a
+
right
*
recsize
),
recsize
);++
left
;--
right
;}}
free
(
pivot
);
quicksort
(
a
,
right
+
1
,
recsize
,
compare
);
quicksort
((
void
*)((
char
*)
a
+
left
*
recsize
),
n
-
left
,
recsize
,
compare
);}
//Sắp xếp mảng các phần tử thuộc 1 kiểu dữ liệu bất kì (int, char**, struct, v.v...) bằng thuật
toán Merge Sort.
//a: con trỏ đến phần tử đầu tiên của mảng (Base Address).
-2-

C:\Users\Little_Chick\Desktop\Desktop\sort UTF8.cppSaturday, June 18, 2011 11:08 PM
//n: số lượng phần tử trong mảng (Number of Elements).//recsize: kích thước từng phần tử, tính bằng byte (Element Width).//compare: con trỏ đến hàm chứa cách so sánh (Comparison Function).
voidmergesort
(
void
*
a
,
intn
,
intrecsize
,
int
(*
compare
)(
const void
*,
const void
*)){if(
n
==
1
)return;
intl
=
n
/
2
;
intr
=
n
-
l
;
void
*
b
=
malloc
(
l
*
recsize
);
void
*
c
=
malloc
(
r
*
recsize
);
memcpy
(
b
,
a
,
l
*
recsize
);
memcpy
(
c
, (
void
*)((
char
*)
a
+
l
*
recsize
),
r
*
recsize
);
mergesort
(
b
,
l
,
recsize
,
compare
);
mergesort
(
c
,
r
,
recsize
,
compare
);
inti
(
0
),
j
(
0
);
n
=
0
;while(
i
<
l
&&
j
<
r
){if(
compare
((
void
*)((
char
*)
b
+
i
*
recsize
), (
void
*)((
char
*)
c
+
j
*
recsize
)) >
0
)
memcpy
((
void
*)((
char
*)
a
+
n
++ *
recsize
), (
void
*)((
char
*)
c
+
j
++ *
recsize
),
recsize
);else
memcpy
((
void
*)((
char
*)
a
+
n
++ *
recsize
), (
void
*)((
char
*)
b
+
i
++ *
recsize
),
recsize
);}while(
i
<
l
)
memcpy
((
void
*)((
char
*)
a
+
n
++ *
recsize
), (
void
*)((
char
*)
b
+
i
++ *
recsize
),
recsize
);while(
j
<
r
)
memcpy
((
void
*)((
char
*)
a
+
n
++ *
recsize
), (
void
*)((
char
*)
c
+
j
++ *
recsize
),
recsize
);
free
(
b
);
free
(
c
);}
//Tìm kiếm dữ liệu trong 1 mảng có kiểu dữ liệu bất kì (đã được sắp xếp trước đó) bằng thuậttoán Binary Search (Tìm kiếm nhị phân).//Khi tìm kiếm thành công, hàm trả về con trỏ đến phần tử đó trong mảng.//Nếu thất bại, trả về NULL.
//
//key: con trỏ đến dữ liệu cần tìm (Object to Search for).//a: con trỏ đến phần tử đầu tiên của mảng (Base Address)//n: số lượng phần tử trong mảng (Number of Elements)//recsize: kích thước từng phần tử, tính bằng byte (Element Width)//compare: con trỏ đến hàm chứa cách so sánh (Comparison Function)
void
*
binarysearch
(
const void
*
key
,
const void
*
a
,
intn
,
intrecsize
,
int
(*
compare
)(
const void
*,
const void
*)){
intleft
(
0
),
mid
(
0
),
right
(
n
-
1
);
-3-