最近因为自已在做一个小项目,深深的认识到自已的算法真的是差极了,于是最近就开始看一点关于排序的算法开始入门。首先第一种就是快速排序,快速排序起名就是源于它比较快的就能得出顺序。下面我来说一下快速排序的原理:首先需要选择一个数作为对比(一般选择的是数组的第一个数),然后有一个指向数组头的数left,还有一个指向数组位的right。首先是要从右边开始找出比对比数小的那个数存着,然后从左边找出一个比对比数大的数出来存在,依次循环直到left等于right结束第一轮循环,就把对比数放进去该放进的位置(也就是说左边全部比它小的,右边全部比它大的)。下轮开始就是把对比数的两边分开依次的排序直到所有数找到自已合适的位置,也就是把对比数找到合适的位置。因为每一次循环都会出现对比数。
#include <stdio.h>
#define MAX_ARRAY 8
//快速排序函数
void quick_sort(int num[], int left, int right);
int main(void)
{
int i = 0;
int array[MAX_ARRAY] = {5, 8, 6, 1, 3, 9, 2, 0};
quick_sort(array, 0, MAX_ARRAY - 1);
for (i = 0; i < MAX_ARRAY; i++)
{
printf("array[%d] = %d\n", i + 1, array[i]);
}
return 0;
}
void quick_sort(int num[], int left, int right)
{
//这个作为递归的出口是必须要有的
if (left > right)
{
return ;
}
int i, j, temp;
//保存需要排序的那个数(对比数)
temp = num[left];
i = left;
j = right;
//从右边开始检查比5小的数
while (i != j)
{
while ((i < j) && (temp <= num[j]))
{
j--;
}
num[i] = num[j];
//从左边开始检查比5大的数
while ((i < j) && (temp >= num[i]))
{
i++;
}
//最后把对比数插入应该的位置
num[j] = num[i];
}
num[i] = temp;
//递归入口,把对比数的两边分开分别进行排序
quick_sort(num, left, i-1);
quick_sort(num, i+1, right);
}
这里我个人建议学者们还是画一个数组来自已根据程序的思路理解一下,因为当时自已学的时候也发觉不画图真的难学,在这里我自已也懒画图了,自已画个图还是很好理解的。