Sắp xếp nổi bọt trong ngôn ngữ C

1, Triển khai thuật toán sắp xếp nổi bọt cơ bản

2, Sử dụng hàm qsort để sắp xếp dữ liệu cấu trúc

1, Triển khai thuật toán sắp xếp nổi bọt cơ bản

#include<stdio.h>
//Hàm sắp xếp nổi bọt
//void bubble_sort(int mang[], int kich_thuoc) {
//	int i = 0;
//	//Số lần lặp
//	for ( i = 0; i < kich_thuoc-1; i++)
//	{
//		int  co_doi_huong = 1;//Giả sử mảng đã được sắp xếp
//		//Quá trình một lần sắp xếp nổi bọt
//		int j = 0;
//		for ( j = 0; j < kich_thuoc-1-i; j++)
//		{
//			if (mang[j]>mang[j+1])
//			{
//				int trung_gian = mang[j];
//				mang[j] = mang[j + 1];
//				mang[j + 1] = trung_gian;
//				co_doi_huong = 0;
//			}
//		}
//		if (co_doi_huong == 1) {
//			break;
//		}
//	}
//}
//
//int main() {
//	int mang[] = { 9,8,7,6,5,4,3,2,1,0 };
//	//Sắp xếp mảng theo thứ tự tăng dần
//	int kich_thuoc = sizeof(mang) / sizeof(mang[0]);
//	bubble_sort(mang, kich_thuoc);
//	int i = 0;
//	for ( i = 0; i < kich_thuoc; i++)
//	{
//		printf("%d ", mang[i]);
//	}
//	return 0;
//}

//Phiên bản tối ưu hóa của sắp xếp nổi bọt

//void qsort(void* base,//Vị trí bắt đầu của dữ liệu cần sắp xếp
//	       size_t num,//Số lượng phần tử dữ liệu cần sắp xếp
//		   size_t width,//Kích thước của phần tử dữ liệu (đơn vị: byte)
//	       int(* cmp)(const void* e1,const void* e2)//Con trỏ hàm - hàm so sánh
//	);
int so_sanh_so_nguyen(const void* e1, const void* e2) {
	return (*(int*)e1 - *(int*)e2);//Có ép kiểu
}

int main() {
	int mang[] = { 9,8,7,6,5,4,3,2,1,0 };
	//Sắp xếp mảng theo thứ tự tăng dần
	int kich_thuoc = sizeof(mang) / sizeof(mang[0]);
	//bubble_sort(mang, kich_thuoc);
	qsort(mang, kich_thuoc, sizeof(mang[0]), so_sanh_so_nguyen);
	int i = 0;
	for ( i = 0; i < kich_thuoc; i++)
	{
		printf("%d ", mang[i]);
	}
	return 0;
}

2, Sử dụng hàm qsort để sắp xếp dữ liệu cấu trúc

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//Kiểm tra sử dụng qsort để sắp xếp dữ liệu cấu trúc
struct SinhVien
{
	char ten[20]; 
	int tuoi;
};
int so_sanh_sinh_vien_theo_ten(const void* e1, const void* e2) {
	return strcmp(((struct SinhVien*)e1)->ten, ((struct SinhVien*)e2)->ten);
}
int so_sanh_sinh_vien_theo_tuoi(const void* e1, const void* e2) {
	return  ((struct SinhVien*)e1)->tuoi - ((struct SinhVien*)e2)->tuoi;
}
//void kiem_tra_2() {
//	//Kiểm tra sử dụng qsort để sắp xếp dữ liệu cấu trúc
//	struct SinhVien sv[] = { {"Tran Van A",15},{"Nguyen Van B",30},"Le Van C",25} };
//	int kich_thuoc = sizeof(sv) / sizeof(sv[0]);
//	qsort(sv, kich_thuoc, sizeof(sv[0]), so_sanh_sinh_vien_theo_ten);
//	
// }
//int main() {
//	kiem_tra_2();
//	return 0;
//}


//
void HoanDoi(char* buf1, char* buf2, int kich_thuoc) {
	int i = 0;
	for ( i = 0; i < kich_thuoc; i++)
	{
		char tam = *buf1;
		*buf1 = *buf2;
		*buf2 = tam;
		buf1++;
		buf2++;
	}
}
//Hàm bubble_sort tự viết
void bubble_sort_tu_viet(void* base, int kich_thuoc, int kich_thuoc_phan_tu, int(*cmp)(const void* e1, const void* e2)) {
	int i = 0;
	for ( i = 0; i < kich_thuoc-1; i++)
	{
		int co_doi_huong = 1;
		//Quá trình một lần sắp xếp nổi bọt
		int j = 0;
		for ( j = 0; j < kich_thuoc-1-i; j++)
		{
			if (cmp((char*)base+j*kich_thuoc_phan_tu,(char*)base+(j+1)*kich_thuoc_phan_tu)>0)
			{
				//Hoán đổi
				HoanDoi((char*)base + j * kich_thuoc_phan_tu, (char*)base + (j + 1) * kich_thuoc_phan_tu, kich_thuoc_phan_tu);
				co_doi_huong = 0;
			}
		}
		if (co_doi_huong==1)
		{
			break;
		}
	}
}
int so_sanh_so_nguyen(const void* e1, const void* e2) {
	return (*(int*)e1 - *(int*)e2);//Có ép kiểu
}
void kiem_tra_3() {
	int mang[] = { 9,8,7,6,5,4,3,2,1,0 };
	//Sắp xếp mảng theo thứ tự tăng dần
	int kich_thuoc = sizeof(mang) / sizeof(mang[0]);
	//bubble_sort(mang, kich_thuoc);
	bubble_sort_tu_viet(mang, kich_thuoc, sizeof(mang[0]), so_sanh_so_nguyen);
	int i = 0;
	for (i = 0; i < kich_thuoc; i++)
	{
		printf("%d ", mang[i]);
	}
}

void kiem_tra_4() {
	//Kiểm tra sử dụng bubble_sort_tu_viet để sắp xếp dữ liệu cấu trúc
	struct SinhVien sv[] = { {"Tran Van A",15},{"Nguyen Van B",30},{"Le Van C",25} };
	int kich_thuoc = sizeof(sv) / sizeof(sv[0]);
	bubble_sort_tu_viet(sv, kich_thuoc, sizeof(sv[0]), so_sanh_sinh_vien_theo_ten);
 }
int main() {
	//kiem_tra_2();
	//kiem_tra_3();
	kiem_tra_4();
	return 0;
}

Thẻ: sắp xếp nổi bọt thuật toán sắp xếp ngôn ngữ C qsort Cấu trúc dữ liệu

Đăng vào ngày 14 tháng 6 lúc 16:12