101北一女中 資訊選手培訓營 快速排序函式qsort() 2012.08. 07 Nan.

Slides:



Advertisements
Similar presentations
While 迴圈 - 不知重複執行次數
Advertisements

电子成绩单项目实现.
教 师:曾晓东 电 话: E_mail: 计算机软件技术基础 教 师:曾晓东 电 话: E_mail:
第一章 C语言概述 计算机公共教学部.
資料結構與C++程式設計進階 資料結構概論 講師:林業峻 CSIE, NTU 6/ 7, 2010.
第九章 系 统 安 全 性 9.1 结构体 9.2 结构体型数组  9.3 结构体型指针 9.4 内存的动态分配 9.5 共用体
C语言程序设计 第十二章 位运算.
C 程序设计实例 1. 问题描述 2. 数据结构 3. 算法分析 4. 参考程序 5. 改进说明.
Visual C++ introduction
函數 授課:ANT 日期:2009/3/24.
選擇排序法 通訊一甲 B 楊穎穆.
快速排序法 (Quick Sort).
函數 授課:ANT 日期:2011/3/28.
If … else 選擇結構 P27.
Chap 9 结构 9.1 构建手机通讯录 9.2 结构变量 9.3 结构数组 9.4 结构指针.
101北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
STRUCTURE 授課:ANT 日期:2010/5/12.
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
C語言簡介 日期 : 2018/12/2.
Object-Oriented Programming in C++ 第一章 C++的初步知识
101北一女中 資訊選手培訓營 圖論基礎 Nan.
第2章 线性表 线性表抽象数据类型 顺序表 主要知识点 单链表 循环单链表 循环双向链表 静态链表 设计举例.
作弊是否很有诱惑性? 上堂课已经讲了 作业不一定在两个小时里都能完成 答疑没有一个人? 作弊是有记录的 心理系很多同学集体作弊,让人震惊
C语言 程序设计基础与试验 刘新国、2012年秋.
多维数组与指针 用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。 1. 多维数组元素的地址 先回顾多维数组的性质,可以认为二维数组是“数组的数组”,例 : 定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
第13章 结构体的应用 13.1 了解由用户构造的数据类型 13.2 结构体类型说明及结构体变量 13.3 结构体数组
計數式重複敘述 for 迴圈 P
第5讲 结构化程序设计(Part II) 周水庚 2018年10月11日.
Struct結構 迴圈
自我參考結構 (self-reference – 1)
第十章 用户自定义数据类型 目录 学生信息管理系统的开发 结构体数据类型的概述 结构体变量的使用 结构体数组
Main() { Dfas Asdfasf fasdfa } #include <stdio.h> void main( ) {
第11章 位运算 为了节省内存空间,在系统软件中常将多个标志状态简单地组合在一起,存储到一个字节(或字)中。C语言是为研制系统软件而设计的,所以她提供了实现将标志状态从标志字节中分离出来的位运算功能。 所谓位运算是指,按二进制位进行的运算。 11.1 数值在计算机中的表示 11.2.
函式庫補充資料.
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
Chap 5 函数 5.1 计算圆柱体积 5.2 数字金字塔 5.3 复数运算.
C语言程序设计 李祥 QQ:
C qsort.
資料結構與C++程式設計進階 遞迴(Recursion) 講師:林業峻 CSIE, NTU 6/ 17, 2010.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
北一女中 資訊選手培訓營 圖論基礎 By Nan( ).
第二章 类型、对象、运算符和表达式.
Introduction to the C Programming Language
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C程序设计.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
本节内容 结构体数组.
本节内容 指针类型.
第13章 文 件.
Introduction to the C Programming Language
結構、檔案處理(Structure, File)
程式設計--Quick Sort 通訊一甲 B 楊穎穆.
本节内容 结构体数组 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
多重條件選擇敘述
Programming & Language Telling the computer what to do
本节内容 结构体数组 视频提供:昆山爱达人信息技术有限公司.
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
第7章 图.
C++程序语言设计 Chapter 14: Templates.
Array(陣列) Anny
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Introduction to the C Programming Language
函式庫補充資料 1.
C语言基础学习 从外行到入门.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

101北一女中 資訊選手培訓營 快速排序函式qsort() 2012.08. 07 Nan

qsort() 屬於#include<stdlib.h> 採用快速排序 函數格式: ex: qsort(陣列名稱, 元素個數, 單一元素size, 比較函式) ex: int A[N]; qsort(A, N, sizeof(int), comp);

比較函數comp 要自己寫的,只是格式固定採用void指標。 看你的陣列是什麼型態,再在裡面自己轉。 格式: int comp(const void *p, const void *q){ // …比較p跟q所指到位置的值 // 如果p < q,回傳<0的數, // 如果p == q,回傳0 // 如果p > q,回傳>0的數 }

一些飯粒範例 1. int comp(const void *p, const void *q){ int A = *(int *)p; // 把p指向的位置的值解析出來 int B = *(int *)q; // 把q指向的位置的值解析出來 if ( A == B ) return 0; return (A < B) ? -1 : 1; } 2. // 偷懶寫法,要小心overflow int comp(const void *p, const void *q){ return *(int *)p - *(int *q); } 3. // 排字元,一樣要小心overflow int comp(const void *p, const void *q){ return *(char *)p - *(char *)q; } //in main: qsort(A, N, sizeof(char), comp);

一些飯粒範例 4. // double最好這樣寫不然會壞掉 int comp(const void *p, const void *q){ double A = *(double *)p; double B = *(double *)q; if ( A == B ) return 0; return (A < B) ? -1 : 1; } // in main: qsort(nums, N, sizeof(double), comp); 5. // 比字串 #include <string.h> int comp(const void *p, const void *q){ char *strA = *(char **)p; char *strB = *(char **)q; return strcmp(strA, strB); } // in main: qsort(strs, N, sizeof(char *), comp);

一些飯粒範例 6. // 比struct struct edge{ int st, ed, cost; }edges[100]; int comp(const void *p, const void *q){ struct edge A = *(struct edge *)p; struct edge B = *(struct edge *)q; return A.cost – B.cost; //一樣要小心overflow } //in main: qsort(edges, 100, sizeof(struct edge), comp);

使用索引排序 with qsort()

索引排序? 也就是現在假設要把人的體檢資料按照身高排隊,我給每個人一個編號,接著我把這些編號存起來,然後使用編號去排序,排序時按照編號去存取每個人的身高資料,這樣就不需要把整份體檢資料排序 比起原本的排資料,排索引在資料數很多(像Kruskal有起點、終點、cost)時會非常好用,因為它只需要搬索引陣列就好了

小小範例 int ind[5]; int height[5], weight[5], age[5]; int comp(const void *p, const void *q) int main() { int i; for(i=0; i<5; i++) { scanf(“%d %d %d”, &height[i], &weight[i], &age[i]); ind[i] = i; // 生成“索引”陣列 } qsort(ind, 5, sizeof(int), comp); //讓他去排索引 for(i=0; i<5; i++) { printf(“%d: %d”, ind[i], height[ind[i]]); printf(“ %d”, weight[ind[i]]); printf(“ %d”, age[ind[i]]); } return 0; return height[*(int *)p] – height[*(int *)q]; // 比較時是以索引去找資料比