二分排序:
遍历数组元素,将小于当前值的元素移到左边,将大于当前值的元素移到右边;然后分别递归左边、右边继续排序。
假设一个数组为{3,2,5,0,4}
使用如下代码进行排序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ARRAY_SIZE 10
void print(int *array, int length)
{
printf("array = ");
for (int i = 0; i < length; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}
void sort(int *array, int left, int right)
{
if (left < right)
{
int i = left;
int j = right;
int x = array[i]; //当前元素指向最左边
//循环判断
//小于当前元素值的其它元素,移动到左边
//大于当前元素值的其它元素,移动到右边
//{3,2,5,0,4}
while (i < j)
{
//从右往左,找到一个较小的元素,并将该元素移动到左边
while (i < j && array[j] >= x)
j--;
if (i < j)
array[i++] = array[j];
//{0,2,5,0,4}
//从左往右,找到一个较大的元素,并将该元素移动到右边
while (i < j && array[i] < x)
i++;
if (i < j)
array[j--] = array[i];
//{0,2,5,5,4}
}
//得到当前元素排序后所处的位置
array[i] = x;
//{0,2,3,5,4}
//此时,当前元素左边全是较小的元素,右边全是较大的元素
//递归到当前元素的左边
sort(array, left, i - 1);
//递归到当前元素的右边
sort(array, j + 1, right);
}
}
int main()
{
int array[ARRAY_SIZE] = {3,2,5,0,4};
print(array, ARRAY_SIZE);
sort(array, 0, ARRAY_SIZE - 1);
print(array, ARRAY_SIZE);
return 0;
}