如何使用VC库函数中的快速排序函数

函数原型:
void qsort(void *base,size_t num,size_t width,
int (__cdecl *compare )(const void *, const void *) );

第一个是数组地址,第二是数组大小,第三个是数组中每个元素的字节数,最后一个是个函数指针,表示如何比较数组中的元素。

头文件 #include <stdlib.h>
下面分别就int等整数数据,double等浮点数据,结构体和类,按指定方式这四种情况进行讲解。

实例1、对int等整数数据进行排序


代码如下:

int cmp(const void *x, const void *y)
{
 return *(int*)x - *(int*)y;
}
qsort(a, MAXN, sizeof(a[0]), cmp);

MAXN为数组大小,下同

实例2、对double等浮点数进行排序


代码如下:

int cmpDouble(const void *x, const void *y)
{
 return (*(double*)x > *(double*)y ? 1 : -1);
}
qsort(a, n, sizeof(a[0]), cmpDouble);

实例3、对结构体,类等复杂数据进行排序



代码如下:

struct Student
{
 char szName[30];
 int  nAge;
};

先对年龄排序,年龄相同再按姓名排序。


代码如下:

int cmpStudent (const void *x, const void *y)
{   //先作下指针转换,再按要求比较
 Student *pNodex = (Student*)x, *pNodey = (Student*)y;
 if (pNodex->nAge != pNodey->nAge)
  return pNodex->nAge - pNodey->nAge;
 else
  return strcmp(pNodex->szName, pNodey->szName);
}
qsort(a, n, sizeof(a[0]), cmpStudent);

实例4、按指定方式进行排序。
如对只有大小写字母的字符串"AajkuKdYUBCDwyz"进行排序,要求大写字母在前,小写字母在后。


代码如下:

int cmp1(const void *x, const void *y)
{
 char *pcx = (char*)x, *pcy = (char*)y;

bool flag1 = *pcx >= 'A' && *pcx <= 'Z';
 bool flag2 = *pcy >= 'A' && *pcy <= 'Z';

if(flag1 == flag2)    //如果都为大写字母或都为小写字母
  return *pcx - *pcy;
 else                  //否则,谁为大写字母,谁的权值小。
  return flag1 ? -1 : 1;
}
int main()
{
 char szText[] = "AajkuKdYUBCDwyz";
 qsort(szText, strlen(szText), sizeof(szText[0]), cmp1);
 printf("%s\n", szText);
 return 0;
}

(0)

相关推荐

  • vc中SendMessage自定义消息函数用法实例

    本文实例讲述了vc中SendMessage自定义消息函数用法,分享给大家供大家参考.具体如下: SendMessage的基本结构如下: 复制代码 代码如下: SendMessage(     HWND hWnd,  //消息传递的目标窗口或线程的句柄.     UINT Msg, //消息类别(这里可以是一些系统消息,也可以是自己定义,下文具体介绍,)     WPARAM wParam, //参数1 (WPARAM 其实是与UINT是同种类型的,   //在vc编译器中右键有个"转到WPARA

  • VC自定义消息响应函数postmessage用法示例

    本文实例讲述了VC自定义消息响应函数postmessage的用法.分享给大家供大家参考.具体实现步骤如下: 1. 在 resource.h文件添加如下代码 定一个自己的消息 复制代码 代码如下: #define WM_MY_MESSAGE      WM_USER + 100       //---------------------by tyds 2.在...view.h的文件添加如下: 复制代码 代码如下: //{{AFX_MSG(CPostmessageView) afx_msg void

  • VC读配置文件实例

    本文实例讲述了VC读配置文件的方法,分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: char szBugCC[4096]={0};  int nRet = GetPrivateProfileSection("Setting", szBugCC, sizeof(szBugCC), BugConfig.c_str());  if (nRet > 0)  {          //过滤/0 /0 /00          DWORD dwIndex = 0;      

  • VC打印word,excel文本文件的方法

    本文实例讲述了VC里打印word,excel文本文件的方法.分享给大家供大家参考.具体实现方法如下: 1. Vc打印Excel: 关于VC如何打开一个excel,这方面的资料很多了,一般用的是OLE Avtive Control/假设当你打开了一个excel文件,并获得了它的 workbook的handle,相应的接口为: 复制代码 代码如下: COleVariant covTrue((short)true); COleVariant covFalse((short)FALSE); COleVa

  • VC++中内存对齐实例教程

    内存对其是VC++程序设计中一个非常重要的技巧,本文即以实例讲述VC++实现内存对其的方法.具体分析如下: 一.概述 我们经常看到求 sizeof(A) 的值的问题,其中A是一个结构体,类,或者联合体. 为了优化CPU访问和优化内存,减少内存碎片,编译器对内存对齐制定了一些规则.但是,不同的编译器可能有不同的实现,本文只针对VC++编译器,这里使用的IDE是VS2012. #pragma pack()是一个预处理,表示内存对齐.布局控制#pragma,为编译程序提供非常规的控制流信息. 二.结构

  • 解析VC中创建DLL,导出全局变量,函数和类的深入分析

    一.创建DLL1.在VC中新建一个Win32空项目MathLib:2.添加预编译头文件stdafx.h,定义导入导出控制符号: 复制代码 代码如下: //stdafx.h#pragma once#define MATHLIB_EXPORT 3.添加包含要导出的全局变量,函数和类的头文件MathLib.h: 复制代码 代码如下: //MathLib.h #pragma once #ifdef MATHLIB_EXPORT #define MATHLIBAPI __declspec(dllexpor

  • VC++进度条process Bar的用法实例

    本文实例讲述了VC进度条的用法实例,分享给大家供大家参考.具体实现代码如下: 复制代码 代码如下: #include <Windows.h>  #include "resource.h"  #include <Commctrl.h>  //对话框函数  INT_PTR CALLBACK DialogProc(      __in  HWND hwndDlg,      __in  UINT uMsg,      __in  WPARAM wParam,     

  • VC++获得当前进程运行目录的方法

    本文实例讲述了VC++获得当前进程运行目录的方法,分享给大家供大家参考.具体实现方法如下: 该实例主要通过利用windows API获得,具体代码如下: 复制代码 代码如下: CString GetAppPath() {   CString strAppPath;  // 保存结果   TCHAR szModuleFileName[MAX_PATH]; // 全路径名   TCHAR drive[_MAX_DRIVE];  // 盘符名称,比如说C盘啊,D盘啊   TCHAR dir[_MAX_

  • VC中SendMessage和PostMessage的区别

    本文实例讲述了VC中SendMessage和PostMessage的区别.分享给大家供大家参考.具体分析如下: 1.首先是返回值意义的区别,我们先看一下 MSDN 里的声明: 复制代码 代码如下: LRESULT SendMessage (  HWND hWnd,         UINT Msg,         WPARAM wParam,         LPARAM lParam ); 复制代码 代码如下: BOOL PostMessage(  HWND hWnd,         UI

  • 深入VC回调函数的使用详解

    回调函数说白了就是事件响应程序,Windows的每个消息可以理解为一个事件,事件的响应代码要由用户自己来定义.用户定义了事件响应的代码,但还要Windows知道这段代码的位置(要不然Windows就不知道如何去调用,这也没有用),于是用户需要将回调函数的指针告诉Windows,最典型的例子是在窗口类的结构(WNDCLASS)中给lpfnWndProc分量赋回调函数指针值. 回调函数的参数格式是由回调函数的调用者(一般是Windows)来定义的,而回调函数的实现者必须遵循这种格式.Windows程

  • VC++实现CStdioFile写入及读取文件并自动换行的方法

    本文所述CStdioFile可实现在VC++中主要用来写入及读出文件的功能,继承自CFile类,它会自动处理 "\r\n",遇到"\n"自动添加\r并设置光标在当前行,它同时可以自动换行,不过使用CStdioFile在处理大文件时速度有些慢, 用CStdioFile写入读取文件实现代码如下: LPTSTR filter=_T("Playlist Files(.txt)|*.txt|"); CString tempPath; CFileDialog

  • VC文件目录常见操作实例汇总

    一般来说,在VC里文件操作有很多,本文在这里收录了一些常见的函数,分享给大家供大家参考.具体如下: 1. 判断一个目录是否存在 复制代码 代码如下: #include "windows.h" //参数: strPath: 目录的完整路径,注意不要以'/'结尾 //返回值: 如果为目录,返回真,否则返回假 BOOL FolderExist(CString strPath)  {     WIN32_FIND_DATA wfd;     BOOL rValue = FALSE;     H

  • VC实现五子棋游戏的一个算法示例

    本文讲述了VC实现五子棋游戏的一个算法示例,该算法采用极大极小剪枝博弈算法,感兴趣的读者可以对程序中不完善的部分进行修改与完善. 该设计主要包括:数据结构.估值函数.胜负判断.搜索算法 程序运行界面如下: 具体实现步骤如下: 1.数据结构 //记录每步棋,可以建立链表用来进行悔棋.后退(本程序没有实现) struct Step { int x,y; //棋子坐标 int ball; //表示下子方{BLACK,WHITE} }; //记录棋盘情况,用于搜索过程 class CBoardSitua

随机推荐