排序是一门很高深的学问,也是一个无止境的领域,现实中也处处离不开的,例如百度、谷歌的发家,也是靠着独有的搜索排序算法。
常用的排序方法有:
1)冒泡法;2)插入法;3)选择法;4)快速排序法;5)归并排序法;
在这里演示下快速排序法,此算法较为高效,主要思路是,先以第一个数为目标,从前后分别比较,并靠拢,快速找到该数的正确位置,然后以这个位置为界,左右分为两段, 再对这两段分别找到第一个数的正确位置,以此递归查找。
这里贴出该排序的C代码:
代码文件: main.c
#include <stdio.h>
#include <stdlib.h>
/***************************************************
快速排序方法演示
场景:对一个整数数组进行快速排序
思路:每次找到第一个数的正确位置,然后以这个位置为界,两边分别再找第一个数的正确位置,以此递归查找
***************************************************/
void quickSort(int *arr , int start , int end);
int findPosition(int *a , int start , int end);
int main()
{
int a[7] = {34,56,176,11,2,-34,-324};
quickSort(a , 0, 6);
int i;
for(i = 0 ; i < 7 ; i++)
{
printf(" %d ",a[i]);
}
return 0;
}
/***************************************************************
对一个数组两个位置之间的数进行排序
***************************************************************/
void quickSort(int *arr , int start , int end)
{
int position;
if(start < end) //执行条件是start和end两个位置之间有数据
{
position = findPosition(arr , start , end);
quickSort(arr , 0 , position - 1);
quickSort(arr , position+1 , end);
}
//当start==end时,表示此次查找结束。
}
/*******************************************************************
在数组的start和end下标之间,找到以start为下标的数的正确位置。
*******************************************************************/
int findPosition(int *a , int start , int end)
{
int value = a[start]; //(1)以第一个数为目标,先从最后一个开始比较
while(start < end) //循环查找的条件是start和end之间有数
{
while(start < end && a[end] >= value) //(2)先从最后位置(end下标)开始与value比较,若大于等于value刚end下标前移
--end;
//若以end为下标的数小于value,则将该值赋值到以start下标的位置,
a[start] = a[end];
//然后再从start位置向后依次与value值比较
while(start < end && a[start]<= value) //(3)若start位置数比value小于等于,则拿start下标向后移动(递增一下)
++start;
//若以start下标的数比value值大,则将该数赋值到end下标位置上。
a[end] = a[start];
//start与end不相等时,进行下一次循环。
}
//(4)start==end后,代表找到了正确位置,并把value值放到该位置上,以免丢失!
a[start] = value;
return start;
}
运行结果如下图所示: