您的位置:首页 > 编程语言 > C语言/C++

菜鸟学C语言三:快速排序与调用C语言库函数qsort()

2015-01-25 13:37 573 查看
一 快速排序算法

快速排序是对冒泡排序的一种改进,根据就是冒泡排序的特点待排序列越有序,排序效率越高。算法思想基于分治法的:在待排序表中L[1......n]任取一个元素pivot作为基准,通过一趟排序将待排序表划分为独立的两部分L[1.....k-1]和L[k+1....n],使得前部分所有元素都小于pivot,后半部分所有的元素大于或等于pivot,则pivot放在了最后的位置上,这个过程就是一趟快速排序。而后在两个子表上分别递归的重复上过程,直到每部分内只有一个元素或为空为止。

void QuickSort(ElemType A[],int low,int high){
if(low<high){
int pivotpos=Partition(A,low,high);//划分
QuickSort(A,low,pivotpos-1);//依次对两个子表进行递归排序
QuickSort(A,pivotpos+1,high);

}
}<pre name="code" class="html">int Partition(ElemType A[],int low,int high){
ElemType pivot=A[low];//从当前表中第一个元素设为枢轴值,对表进行划分,这是最简单的选取枢轴方式。
while(low<high){      //跳出循环条件
while(low<highh&&A[high]>=pivot) --high;
A[low]=A[high];  //将比枢轴元素小的移动到左端
while(low<high&&A[low]<=pivot)  ++low;
A[high]=A[low];  //将比枢轴元素大的移动到右端
}
A[low]=pivot;       //枢轴元素放到最终位置
return low;         //返回存放枢轴的最终位置
}



</pre><br />二  C语言库函数qsort()调用,实现快速排序<p></p><p>qsort()函数原型的说明,此函数包含在<stdlib.h></p><pre name="code" class="html"><pre name="code" class="html">void qsort(void *base, size_t nmemb, size_t size, int(*compare) (const void *, const void *));
/*     qsort(base, nbr_elements, width_bytes, compare_function);  */
/*        void *base;                                             */
/*        size_t nbr_elements, width_bytes;                       */
/*        int (*compare_function)(const void *, const void *);    */
/*                                                                */
/* Sorts an array starting at base, of length nbr_elements, each  */
/* element of size width_bytes, ordered via compare_function,     */
/* which is called as  (*compare_function)(ptr_to_element1,       */
/* ptr_to_element2) and returns < 0 if element1 < element2,       */
/* 0 if element1 = element2, > 0 if element1 > element2. 
</pre><pre name="code" class="html">base指向数组中待排部分的首元素(即可以是对整个数组,也可以对数组中部分元素进行快速排序)
nmemb要排序元素的数量
size每个数组元素的大小,按字节
compare指向比较函数的指针


</pre><pre name="code" class="html">调用qsort()进行快排时,自己得写个compare函数告诉qsort两个数组元素哪个更小。<div style="margin: 0px; padding: 0px;">当给定两个指向数组元素的指针p和q时,比较函数必须返回一个整数,如果*p小于*q,那么返回的数为负数;如果*p等于*q,那么返回0.如果*p大于*q,返回正数.按照这种结果返回,qsort对数组默认是升序排序.如果想降序,只需要将上述结果返回值*-1。</div><div>
</div>

简单测试:

#include <stdlib.h>

int cmp(const void*, const void*);

int main() {

int num[12] = { 1, 4, -9, 4, 8, 9, 3, 12, 10, 8,14,15 };
qsort(num,12,sizeof(int),cmp);
int i = 0;
for(;i<12;i++){
printf("%d\t",num[i]);
}
return 0;
}

int cmp(const void * a, const void * b) {
return *(int *) a - *(int *) b;
}


三 C语言标准库函数sort()使用

顺带瞧下sort函数:下面片段来自http://www.cplusplus.me/265.html

sort(array,array+n)函数默认是从小到大的,如果降序也是需要写比较函数sort(array,array+n,cmp)

普通排序,升序排列

int main()
{
int a[10]={7,3,4,6,5,1,2,9,8,0};
sort(a,a+10);
for(int i=0;i<10;i++)
pritnf("%d  ",a[i]);
return 0;
}
OUTPUT:0 1 2 3 4 5 6 7 8 9
普通排序,降序

#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int a[10]={7,3,4,6,5,1,2,9,8,0};
sort(a,a+10,cmp);
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
return 0;
}
OUTPUT:9 8 7 6 5 4 3 2 1 0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: