算法特别特别重要,至少我现在是这么认为。我觉得真正懂算法的程序员才能算得上是一个合格程序员,仅仅熟练使用某个程序设计语言的程序员只能算是码农。为了当一个合格的程序员,我要开始学习算法了。哈哈,自己加油。
今天要记录自己刚刚研究的快速排序算法。
快排算法也属于分治法。其核心思想是,将一个数组根据规则拆分成两个数组,然后递归排序两个数组;使用快速排序算法的好处就是节省内存空间,直接在原数组上面排序就可以了,不需要使用额外的内存空间。
快速排序算法的步骤如下,
1、选定数组第一个元素为根元素,将小于根元素的数放到根元素的左侧,大于或者等于根元素的数放到右侧;
2、将左右两侧的子数组分别递归调用步骤1;
伪代码:
int quickSort(array, start, end)//快速排序函数,返回值的是个标记。小于0代表不需要继续排序了;
{
if(start >= end)
结束;
执行步骤1,定位出根节点的位置为i;
quickSort(array, start, i-1);
quickSort(array, i+1, end);
}
c语言实现代码如下
#include <stdio.h>
int quick_sort(int *, int , int);
int main(int argc, char **argv)
{
int arr[] = {6, 10, 13, 5, 8, 3, 2, 11};
int i, j;
int len = sizeof(arr)/sizeof(int) ;
if( quick_sort(arr, 0, len - 1) == -1){
printf("sort error!\n");
} else {
for(i=0; i<len; i++)
printf("%d\t", *(arr+i));
printf("\n");
}
}
int quick_sort(int *array, int start_index, int end_index)
{
printf("start: %d, end: %d;\n", start_index, end_index);
if( start_index >= end_index )
return 0;
int temp;
int i, j;
int x = array[ start_index ];
i = start_index;
for(j = start_index + 1; j <= end_index; j++ ) {
if( array[j] < x ){
i += 1;
temp = array[j];
array[j] = array[i];
array[i] = temp;
}
}
temp = array[i];
array[i] = array[start_index];
array[start_index] = temp;
quick_sort(array, start_index, i-1);
quick_sort(array, i+1, end_index);
return 0;
}
突然想到这个写法有点问题,回去再重写这个算法函数。下班鸟。。。。