http://roclinux.cn/?p=566
全详细解析 :http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.3.2.3.htm
昨天笔试google,不甚理想。算法大题用到了快排算法。在这里温故知新一下,以绝后患:D
大家一定对冒泡排序(Bubble Sort)非常熟悉吧,这种排序算法的思路很简单,但是由于时间复杂度比较高(O(n*n)),所以渐渐被更高效的算法所取代。这些高效算法中就包括了著名的快速排序算法(Quick Sort)。
快速排序算法的基本思想是,通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
一趟快速排序的算法是:附设两个指针low和high,它们的初值分别为low和high,设枢轴记录的关键字为pivotkey,则首先从high所指位置起向前搜索找到第一个关键字小于pivotkey的记录和枢轴记录相互交换,然后从low所指位置起向后搜索,找到第一个关键字大于pivotkey的记录和枢轴记录互相交换,重复这两步直至low=high为止。由此可以该“枢轴”记录最后所落的位置i作为分界线,将序列分隔成两个子序列。
实际上low和high可以被理解为位置标志,它们所指向的只是位置。而pivotkey就是一个数值,它被选取被序列中的一个特定元素。在每趟的快排当中,都是low和high所指位置的元素和pivotkey来做比较。
快速排序的算法要分两大块:
第一大块:一趟快速排序的算法程序,我们将其定为一个函数partseq()
第二大块:整个快速排序算法程序,此程序要调用第一大块的partseq函数,而且在这个部分,我们使用了递归算法来实现多趟快排。
===================================================================================
快速排序算法源代码如下:
[rocrocket@wupengchong Sort_Method]$ cat -n Quick_Sort.c
#include<unistd.h>
#include<stdio.h>
#include<string.h>
int partition(int arr[],int low,int high)
{
arr[0]=arr[low];
while(low<high){
while((low<high)&&(arr[high]>arr[0])) high--;
arr[low]=arr[high];
while((low<high)&&(arr[low]<arr[0])) low++;
arr[high]=arr[low];
}
arr[low]=arr[0];
printf("pivotindex:%d/n",low);
return low;
}
void si_sort(int arr[],int low,int high)
{
int pivotindex;
if(low<high){
pivotindex=partition(arr,low,high);
si_sort(arr,low,pivotindex-1);
si_sort(arr,pivotindex+1,high);
}
}
void print_arr(int arr[],int arrnum){
int i=1;
printf("Sorted sequence:");
for(;i<=arrnum;i++){
printf("%d ",arr[i]);
}
printf("/n");
}
int main()
{
int index=1,arrnum;
char s[100],*sp;
int num[10]={0};
printf("Please input(ex:3 5 6 1 7 14):");
fgets(s,sizeof(s),stdin);
sp=strtok(s," ");
while(sp!=NULL){
num[index++]=atoi(sp);
sp=strtok(NULL," ");
}
arrnum=index-1;
printf("You have input %d numbers./n",arrnum);
si_sort(num,1,arrnum);
print_arr(num,arrnum);
return 0;
}
over~ |