冒泡排序
每次选出一个最大的。
数组n个元素,需要进行n-1次
交换的时候需要注意大小顺序
void bubble_sort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) { // 注意这里是n-1-i,每次排序完,它都需要缩小范围
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}快速排序
算法思想:
根据基准将数组分为两个部分,左边的是小于基准的,右边的是大于基准的。然后对于两个部分的每一部分继续快速排序,就是递归。
C语言实现思路:
排序完成的表现:左右两个指针指向同一个位置。
选择基准:通常为每个部分的第一个元素
交换后,对应的指针要+1
/**
* 待排序的数组
* 左指针
* 右指针
*/
void quick_sort(int *num, int start_num, int end_num) {
if (start_num < end_num) { // 退出递归的条件,千万不能忘记
int i = start_num;
int j = end_num;
int temp = num[start_num]; // 以第一个元素为基准
while (i < j) { // 【i==j时为基准元素的位置】
// 从右边向左边扫描,直到比基准小,或者左右指针相遇
while (i < j && num[j] > temp)
j--;
if (i < j) // 左右指针相遇的话,这个就不成立
{
num[i] = num[j]; // 右边的元素插在空位上
i++; // 更新左指针
}
// 从左边向右边扫描,直到比基准大,或者左右指针相遇
while (i < j && num[i] <= temp)
i++;
if (i < j) {
num[j] = num[i];
j--; // 更新右指针
}
}
num[i] = temp; // 此时i为基准元素的位置,基准元素归位
// 基准元素不动,所以需要-1和+1
quick_sort(num, start_num, i - 1); // 递归左边部分
quick_sort(num, i + 1, end_num); // 递归右边部分
}
}