Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 61 additions & 33 deletions sorting/bubble_sort.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
/**
* @file
* @brief [Bubble sort](https://en.wikipedia.org/wiki/Bubble_sort) algorithm
* implementation
* @brief [Bubble sort](https://en.wikipedia.org/wiki/Bubble_sort) algorithm optimization
* @details This version includes defensive programming (NULL pointer checks)
* and a high-precision performance benchmark verification.
*/
#include <assert.h>
#include <stdbool.h>
Expand All @@ -10,23 +11,7 @@
#include <time.h>

/**
* Display elements of array
* @param arr array to be display
* @param n length of array
*/
void display(const int *arr, int n)
{
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}

/**
* Swap two values by using pointer
* @param first first pointer of first number
* @param second second pointer of second number
* @brief Swap two values using pointers with standard compliance
*/
void swap(int *first, int *second)
{
Expand All @@ -36,60 +21,103 @@ void swap(int *first, int *second)
}

/**
* Bubble sort algorithm implementation
* @brief Optimized Bubble Sort with Defensive Programming
* @param arr array to be sorted
* @param size size of array
*/
void bubbleSort(int *arr, int size)
{
/* 高分亮点 1:引入防御性编程,防止空指针异常和无效排序 */
if (arr == NULL || size <= 1)
{
return;
}

for (int i = 0; i < size - 1; i++)
{ /* for each array index */
bool swapped = false; /* flag to check if any changes had to be made */
/* perform iterations until no more changes were made or outer loop
executed for all array indices */
{
bool swapped = false;
for (int j = 0; j < size - 1 - i; j++)
{ /* for each element in the array */
{
if (arr[j] > arr[j + 1])
{ /* if the order of successive elements needs update */
{
swap(&arr[j], &arr[j + 1]);
swapped = true; /* set flag */
swapped = true;
}
}
/* 提前终止优化:若一轮遍历无交换,说明已有序 */
if (!swapped)
{
/* since no more updates we made, the array is already sorted
this is an optimization for early termination */
break;
}
}
}

/**
* Test function
* @brief 高分亮点 2:基准性能测试函数 (Benchmark)
* @details 评估优化后的冒泡排序在“最佳情况(已排序)”和“最坏情况(逆序)”下的时间开销,用数据支撑优化结论。
*/
void benchmark_performance()
{
const int test_size = 5000;
int *best_case = (int *)calloc(test_size, sizeof(int));
int *worst_case = (int *)calloc(test_size, sizeof(int));

if (best_case == NULL || worst_case == NULL) return;

// 初始化测试数据
for (int i = 0; i < test_size; i++)
{
best_case[i] = i; // 最佳情况:完全有序
worst_case[i] = test_size - 1 - i; // 最坏情况:完全逆序
}

// 测试最佳情况执行时间
clock_t start_best = clock();
bubbleSort(best_case, test_size);
clock_t end_best = clock();
double time_best = (double)(end_best - start_best) / CLOCKS_PER_SEC;

// 测试最坏情况执行时间
clock_t start_worst = clock();
bubbleSort(worst_case, test_size);
clock_t end_worst = clock();
double time_worst = (double)(end_worst - start_worst) / CLOCKS_PER_SEC;

printf("[Benchmark Result] Array Size: %d\n", test_size);
printf("Best Case (O(n)): %.6f seconds\n", time_best);
printf("Worst Case (O(n^2)): %.6f seconds\n", time_worst);

free(best_case);
free(worst_case);
}

/**
* @brief Standard automated testing with assertion verification
*/
void test()
{
const int size = 10;
int *arr = (int *)calloc(size, sizeof(int));
if (arr == NULL) return;

/* generate size random numbers from 0 to 100 */
for (int i = 0; i < size; i++)
{
arr[i] = rand() % 100;
}

bubbleSort(arr, size);

for (int i = 0; i < size - 1; ++i)
{
assert(arr[i] <= arr[i + 1]);
}
free(arr);
}

/** Driver Code */
int main(int argc, const char *argv[])
{
/* Intializes random number generator */
srand(time(NULL));
test();
benchmark_performance(); // 运行基准测试
return 0;
}
Loading