C中qsort快速排序使用实例

简单的介绍如下。


代码如下:

/************************************************************************
qsort原型:
void qsort( void *base, size_t num, size_t width,
int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
base:数组首地址
num: 数组元素个数
width: 每个数组元素字节数
compare:比较函数 注意类型转换
************************************************************************/
#include <stdio.h>
#include <string.h> //strcmp函数
#include <stdlib.h> //qsort函数
#include <math.h> //fabs(double),abs(int)

int intcmp(const void*i1,const void *i2)
{
 return *(int*)i1-*(int*)i2;
}
int doublecmp(const void *d1,const void *d2)
{
 //return *(double*)d1 - *(double*)d2;//出现错误 double不精确的
 double tmp=*(double*)d1 - *(double*)d2;
 if(fabs(tmp) < 0.000001)
  return 0;
 else
  return tmp>0 ? 1 : -1;
}
int stringcmp(const void *str1,const void *str2)
{
 return strcmp(*(char**)str1,*(char**)str2);
 /*
 这里为什么是 *(char**)呢?比较函数的参数都是数组元素的地址。
 如果是 int[],那么其元素就是int.传入的&int[i],那么要比较的话,void *i1转换
 为 int*的在取值。一样,对于字符串数组而言,char*s[]其内存放的就是各个串的首地址。
 char*.所以转换为void *后。其为 &(char*)。所以要从void *转换回去比较。就要用到二级指针(char**)str1,
 确保str1进过一次寻址后,*str1后为char*.可参见msdn例子。
 */
}

void main()
{
 printf("---------------------C中qsort使用方法(默认递增)----------------------\n");

int a[]={1,2,6,8,10,7,9,40,12,6,7};
 printf("-------int[]数组qsort测试-------\nbefore sort:\n");
 for(int i=0;i!=sizeof(a)/sizeof(int);i++)
  printf("%d ",a[i]);
 qsort(a,sizeof(a)/sizeof(int),sizeof(a[0]),intcmp);
 printf("\nafter sort:\n");
 for(int i=0;i!=sizeof(a)/sizeof(int);i++)
  printf("%d ",a[i]);
 printf("\n");

printf("-------double[]数组qsort测试-------\nbefore sort:\n");
 double d[]={1.12,1.1236,1.36,1.2456,2.48,2.24123,-2.3,0};
 for(int i=0;i!=sizeof(d)/sizeof(double);i++)
  printf("%f ",d[i]);
 qsort(d,sizeof(d)/sizeof(double),sizeof(d[0]),doublecmp);
 printf("\nafter sort:\n");
 for(int i=0;i!=sizeof(d)/sizeof(double);i++)
  printf("%f ",d[i]);
 printf("\n");

printf("-------string: char*[]数组qsort测试-------\nbefore sort:\n");
 char *str[]={"hello","hi","you","are","baby"};
 for(int i=0;i!=sizeof(str)/sizeof(str[0]);i++)
  printf("%s ",str[i]);
 printf("\nafter sort:\n");
 qsort(str,sizeof(str)/sizeof(str[0]),sizeof(str[0]),stringcmp);
 for(int i=0;i!=sizeof(str)/sizeof(str[0]);i++)
  printf("%s ",str[i]);
 printf("\n");
}

(0)

相关推荐

  • C/C++实现快速排序的方法

    快速排序不会直接得到最终结果,只会把比k大和比k小的数分到k的两边.(你可以想象一下i和j是两个机器人,数据就是大小不一的石头,先取走i前面的石头留出回旋的空间,然后他们轮流分别挑选比k大和比k小的石头扔给对面,最后在他们中间把取走的那块石头放回去,于是比这块石头大的全扔给了j那一边,小的全扔给了i那一边.只是这次运气好,扔完一次刚好排整齐.)为了得到最后结果,需要再次对下标2两边的数组分别执行此步骤,然后再分解数组,直到数组不能再分解为止(只有一个数据),才能得到正确结果. -- 取自百度百科

  • c语言快速排序算法示例代码分享

    步骤为:1.从数列中挑出一个元素,称为 "基准"(pivot);2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边).在这个分区退出之后,该基准就处于数列的中间位置.这个称为分区(partition)操作.3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序.递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了.虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iterat

  • JavaScript快速排序

    function quickSort() { function doSort(a,s,e) { if(stemp); if(s>e)break; var tem=a[s]; a[s]=a[e]; a[e]=tem; } a[st]=a[e]; a[e]=temp; return e; } doSort(this,0,this.length-1); return this; } Array.prototype.quickSort=quickSort; alert(new Array(5,2,4,6

  • C#中使用快速排序按文件创建时间将文件排序的源码

    快速排序类 using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using Sy

  • 用c语言实现冒泡排序,选择排序,快速排序

    代码如下所示: 复制代码 代码如下: /* * 冒泡排序 */void BubbleSort(int arr[], int n){ int temp; for (int i = 0; i < n - 1; i++) {  for (int j = i + 1; j < n; j++)  {   if (arr[i] > arr[j])   {    temp = arr[i];    arr[i] = arr[j];    arr[j] = temp;   }  } }}/* * 选择排

  • C#排序算法之快速排序

    快速排序实现: 复制代码 代码如下: namespace QuickSort { class QuickSort { public static void Sort(int[] array) { DoSort(array,0, array.Length-1); } private static void DoSort( int[] array, int start, int end) { if( start < end) { int temp = Partition(array, start,

  • 数据排序谁最快(javascript中的Array.prototype.sort PK 快速排序)

    但是让我感到意外的是,下面有个网友回复说,javascript中的Array本身的sort方法才是最快的,比快速排序算法都快,当时看到了很是郁闷,因为当时花了好长时间在排序算法上,居然忘记了Array本身的sort方法 不过javascript中内置的sort方法真的比快速排序算法还快吗? 哈哈,测试一下不就知道了 先说一下我测试的环境 1,我的测试环境是IE6.0和firefox2.0 2,每种算法有很多种不同的实现方法,下面测试中我选择上面网友实现的快速排序算法,只是把内嵌函数搬到了外面 3

  • C++快速排序的分析与优化详解

    相信学过数据结构与算法的朋友对于快速排序应该并不陌生,本文就以实例讲述了C++快速排序的分析与优化,对于C++算法的设计有很好的借鉴价值.具体分析如下: 一.快速排序的介绍 快速排序是一种排序算法,对包含n个数的输入数组,最坏的情况运行时间为Θ(n2)[Θ 读作theta].虽然这个最坏情况的运行时间比较差,但快速排序通常是用于排序的最佳的实用选择.这是因为其平均情况下的性能相当好:期望的运行时间为 Θ(nlgn),且Θ(nlgn)记号中隐含的常数因子很小.另外,它还能够进行就地排序,在虚拟内存

  • C中qsort快速排序使用实例

    简单的介绍如下. 复制代码 代码如下: /************************************************************************qsort原型:void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );base:数组首地址 num: 数组元素个数width: 每个数组元

  • Java快速排序QuickSort(实例)

    快速排序 ---------------------------------------------------------------------- 思想 如上图:每趟快速排序开始时,设置一个key,key=array[low],然后由high向左,找到小于key的值,复制到low位置,然后再由low向右找到大于key的值,复制到high位置,直到low=high结束, 将key的复制到low位置. 上图中第一轮划分后找到32的位置,然后递归的对32左边和右边的进行排序. 代码: packag

  • C语言对磁盘文件进行快速排序简单实例

    C语言对磁盘文件进行快速排序简单实例 快速排序(quick sort)是由C.A.R.Hoare发明并命名的,这种排序被认为是目前最好的一种排序算法.快速排序基于交换排序,与同样的基于交换排序的冒泡排序法相比,其效果非常明显. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 本例中快速排序是通过函数quick_disk(FILE

  • C语言库函数中qsort()的用法

    目录 (一)void*  的指针类型是什么? (二)void qsort(void*, size_t, size_t, int ( * )(const void * ,  const void *  ))  该怎么使用该库函数? (三)使用qsort()来排序不同类型的数据  总结: qsort是库函数提供的一种排序方法,我们就简单1了解一下怎么去用,而不去深究它的库函数是怎么写的 qsort是库函数中提供的一种能排序任何类型的数据的一种排序方法,思想是quick sort(快速排序),今天我听

  • JDBC中resutset接口操作实例详解

    本文主要向大家展示JDBC接口中resutset接口的用法实例,下面我们看看具体内容. 1. ResultSet细节1 功能:封锁结果集数据 操作:如何获得(取出)结果 package com.sjx.a; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import org.junit.Test; //1. next方

  • AngularJS中filter的使用实例详解

    AngularJS中filter的使用实例详解 一.格式化数字为货币格式. <div>{{money|currency:"$"}}</div> <div>{{money|currency:"RMB"}}</div> script: app.controller("crl", function($scope, $filter) { $scope.money="4545"; });

  • Angularjs中ng-repeat的简单实例

    Angularjs中ng-repeat的简单实例 第一个例子:使用ng-repeat最简单的例子 <html ng-app="myApp"> <head> <title>angularjs-demo</title> <script type="text/javascript" src="angular.min.js" charset="utf-8"></scri

  • PHP 中魔术常量的实例详解

    PHP 中魔术常量的实例详解 本文介绍下,php编程中的魔术常量,掌握并灵活应用这些方法与常量,对于提高php的编程水平,有很大的帮助.有需要的朋友参考学习下. 魔术常量: namespace ns1; class Test { function __construct() { var_dump(__LINE__); var_dump(__FILE__); var_dump(__DIR__); var_dump(__FUNCTION__); var_dump(__CLASS__); var_du

  • OAuth认证协议中的HMACSHA1加密算法(实例)

    实例如下: <?php function hmacsha1($key,$data) { $blocksize=64; $hashfunc='sha1'; if (strlen($key)>$blocksize) $key=pack('H*', $hashfunc($key)); $key=str_pad($key,$blocksize,chr(0x00)); $ipad=str_repeat(chr(0x36),$blocksize); $opad=str_repeat(chr(0x5c),$

  • JSP中param动作的实例详解

    JSP中param动作的实例详解 一 语法 <jsp:param name="参数名" value="参数值"> 常常与<jsp:forward>一起使用,作为其子标签存在. 二 代码 1.login.jsp <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"

随机推荐