一、冒泡排序
冒泡排序是一种基础的、简单的排序算法,它的排序过程中比较相邻的两个元素,如果它们的顺序错误就进行交换,直到整个数组变为升序排序为止。冒泡排序的时间复杂度为O(n^2)。
void bubble_sort(char* str[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j 0) { char* temp = str[j]; str[j] = str[j + 1]; str[j + 1] = temp; } } } }
二、插入排序
插入排序是一种简单直观的排序算法,它的思路是将一个元素插入到已经排好序的数组中,直到全部插入完毕。插入排序的时间复杂度为O(n^2)。
void insertion_sort(char* str[], int n) { for (int i = 1; i 0 && strcmp(str[j], str[j - 1]) < 0; j--) { char* temp = str[j]; str[j] = str[j - 1]; str[j - 1] = temp; } } }
三、选择排序
选择排序是一种简单直观的排序算法,它的思路是每次从未排序的元素中选择最小的元素,依次放置在已排好序的数组中的最后一个位置。选择排序的时间复杂度为O(n^2)。
void selection_sort(char* str[], int n) { for (int i = 0; i < n; i++) { int min_index = i; for (int j = i + 1; j < n; j++) { if (strcmp(str[j], str[min_index]) < 0) { min_index = j; } } char* temp = str[i]; str[i] = str[min_index]; str[min_index] = temp; } }
四、快速排序
快速排序是一种高效率、通用的排序算法,它的思路是以一个基准元素为分界点将数组分为两个子序列,比基准元素小的元素放在基准元素左边,比基准元素大的元素放在右边,然后通过递归排序子序列,最终达到整个序列有序的目的。快速排序的时间复杂度为O(nlogn)。
void quick_sort(char* str[], int left, int right) { if (left >= right) return; char* pivot = str[left]; int i = left, j = right; while (i < j) { while (i = 0) j--; str[i] = str[j]; while (i < j && strcmp(str[i], pivot) <= 0) i++; str[j] = str[i]; } str[i] = pivot; quick_sort(str, left, i - 1); quick_sort(str, i + 1, right); }
五、归并排序
归并排序是一种基于分治思想的排序算法,它的思路是先将序列分成若干个子序列,分别对每个子序列进行排序,再将排好序的子序列合并成一个有序序列,最终达到整个序列有序的目的。归并排序的时间复杂度为O(nlogn)。
void merge(char* str[], int left, int mid, int right, char* temp[]) { int i = left, j = mid + 1, k = 0; while (i <= mid && j <= right) { if (strcmp(str[i], str[j]) <= 0) { temp[k++] = str[i++]; } else { temp[k++] = str[j++]; } } while (i <= mid) { temp[k++] = str[i++]; } while (j <= right) { temp[k++] = str[j++]; } for (int n = 0; n = right) return; int mid = (left + right) / 2; merge_sort(str, left, mid, temp); merge_sort(str, mid + 1, right, temp); merge(str, left, mid, right, temp); }
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/280447.html