`
fanrey
  • 浏览: 251886 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

c语言数组排序小结(转载)

阅读更多
c语言数组排序小结(for beginner)

  很多朋友是以谭浩强老师编的《c语言教程》作为学习c语言的入门教程的。书中涉及排序问题一般都以“冒泡法”和“选择法”实现。为了扩大视野,增加学习编程的兴趣,我参阅了有关书籍,整理了几种排序法,写出来同大家共勉。(高手们不要笑,这篇文章是写给出学者的,而且我自己也是只菜鸟,虽然内容陈旧,但值得初学者一看)。

  让我们先定义一个整型数组a[n],下面用五种方法对其从小到大排序。

  (1)“冒泡法”

  冒泡法大家都较熟悉。其原理为从a[0]开始,依次将其和后面的元素比较,若a[0]>a[i],则交换它们,一直比较到a[n]。同理对a[1],a[2],...a[n-1]处理,即完成排序。下面列出其代码:
void bubble(int *a,int n)
{
int i,j,temp;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[i]>a[j]) {
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}

  冒泡法原理简单,但其缺点是交换次数多,效率低。

  下面介绍一种源自冒泡法但更有效率的方法“选择法”。

  (2)“选择法”

  选择法循环过程与冒泡法一致,它还定义了记号k=i,然后依次把a[k]同后面元素比较,若a[k]>a[j],则使k=j.最后看看k=i是否还成立,不成立则交换a[k],a[i],这样就比冒泡法省下许多无用的交换,提高了效率。

void choise(int *a,int n)
{
int i,j,k,temp;
for(i=0;i<n-1;i++) {
k=i;
for(j=i+1;j<n;j++)
if(a[k]>a[j]) k=j;
if(i!=k) {
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
}
}

  选择法比冒泡法效率更高,但说到高效率,非“快速法”莫属,现在就让我们来了解它。

  (3)“快速法”

  快速法定义了三个参数,(数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j). 它首先选一个数组元素(一般为a[(i+j)/2],即中间元素)作为参照,把比它小的元素放到它的左边,比它大的放在右边。然后运用递归,在将它左,右两个子数组排序,最后完成整个数组的排序。下面分析其代码:

void quick(int *a,int i,int j)
{
int m,n,temp;
int k;
m=i;
n=j;
k=a[(i+j)/2];
do {
while(a[m]<k&&m<j) m++;
while(a[
n]>k&&n>i) n--;
if(m<=n) {
temp=a[m];
a[m]=a[n];
a[n]=temp;
m++;
n--;
}
}while(m<=n);
if(m<j) quick(a,m,j);
if(n>i) quick(a,i,n);
}



(4)“插入法”
  插入法是一种比较直观的排序方法。它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置。把数组元素插完也就完成了排序。

void insert(int *a,int n)
{
int i,j,temp;
for(i=1;i<n;i++) {
temp=a[i];
j=i-1;
while(j>=0&&temp<a[j]) {
a[j+1]=a[j];
j--;
}
a[j+1]=temp;
}
}

  (5)“shell法”

  shell法是一个叫 shell 的美国人与1969年发明的。它首先把相距k(k>=1)的那几个元素排好序,再缩小k值(一般取其一半),再排序,直到k=1时完成排序。下面让我们来分析其代码:

void shell(int *a,int n)
{
int i,j,k,x;
k=n/2;
while(k>=1) {
for(i=k;i<n;i++) {
x=a[i];
j=i-k;
while(j>=0&&x<a[j]) {
a[j+k]=a[j];
j-=k;
}
a[j+k]=x;
}
k/=2;
}
}

 
分享到:
评论

相关推荐

    C语言数组排序小结

    C语言数组排序小结

    C语言中qsort函数用法实例小结

    一、对int类型数组排序 int num[100]; int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } qsort(num,100,sizeof(num[0]),cmp); 二、对char类型数组排序(同int类型) char ...

    C语言程序设计标准教程

    其中static表示是静态存储类型, C语言规定只有静态存储数组和外部存储数组才可作初始化赋值(有关静态存储,外部存储的概念在第五章中介绍)。在{ }中的各数据值即为各元素的初值, 各值之间用逗号间隔。例如: ...

    C语言讲义.doc

    1.1.23 指针小结 63 2 字符指针与字符串 64 2.1 指针和字符串 64 2.2 通过指针访问字符串数组 64 2.3 函数的参数为CHAR * 64 2.4 指针数组做为MAIN函数的形参 65 3 内存管理 65 3.1 作用域 65 3.1.1 auto自动变量 65...

    严蔚敏 数据结构(C语言版) 代码 23490 书中算法

    1.5 小结 15 习题 16 第2章 线性表 18 2.1 线性表的类型定义 18 2.1.1 线性表的定义和特点 18 2.1.2 线性表的抽象数据类型定义 18 2.2 线性表的顺序表示和实现 19 2.2.1 线性表的顺序存储表示 19 ...

    程序设计抽象思想:C语言描述-

     1.7 小结  1.8 复习题  1.9 编程练习  第2章 C的数据类型  2.1 枚举类型  2.2 数据和内存  2.3 指针  2.4 数组  2.5 指针和数组  2.6 记录  2.7 动态分配  2.8 小结  2.9 复习题  2.10 编程练习  第...

    C语言课程设计-设计一个系统

    计算每个学生三门课程的总分(sum,单精度)及平均分(aver,单精度,输出一位小数),将包括所有数据的结构体数组元素按总分从大到小的顺序排序打印出来。 3. 查找。任意输入一位学生的姓名或学号,打印出他的所有...

    上海电机学院C语言实训答案

     实训小结 4. 程序运行方式 构建一个简易菜单,形如: 用户通过输入数值选择所需运行的子程序,当一个子程序运行结束后回到菜单界面,直至用户输入0后退出程序。 5.实训选题 每人至少做6题,题目如下(每人的...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    10.8 有关指针的数据类型和指针运算的小结 167 10.8.1 有关指针的数据类型的小结 167 10.8.2 指针运算的小结 167 10.8.3 void 指针类型 168 11 结构体与共用体 11.1 定义一个结构的一般形式 170 11.2 结构类型变量的...

    数据结构(C语言版)\Java数据结构和算

    7.9 内部排序小结 7.10 外部排序 7.11 参考文献和选读材料 第8章 Hash法 8.1 引言 8.2 静态Hash法 8.3 动态Hash法 8.4 Bloom滤波器 8.5 参考文献和选读材料 第9章 优先队列 9.1 单端优先队列和双端优先...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    10.8 有关指针的数据类型和指针运算的小结 167 10.8.1 有关指针的数据类型的小结 167 10.8.2 指针运算的小结 167 10.8.3 void 指针类型 168 11 结构体与共用体 11.1 定义一个结构的一般形式 170 11.2 结构类型变量的...

    C语言通用范例开发金典.part2.rar

    1.8 本章小结 395 第2章 数值计算 397 2.1 常见的数学函数 398 2.1.1 求整数的绝对值 398 范例2-1 求整数的绝对值 398 ∷相关函数:abs函数 2.1.2 求长整型整数的绝对值 399 范例2-2 求长整型整数的绝对值 ...

    C语言课程信息管理系统课程设计报告.docx

    计算所有课程的总学分及平均学分(aver,单精度,输出一位小数),将包括所有数据的数组元素按价格从高到低的顺序排序打印出来。 概要设计 C语言课程信息管理系统课程设计报告全文共32页,当前为第4页。程序流程图:...

    C语言通用范例开发金典.part1.rar

    1.8 本章小结 395 第2章 数值计算 397 2.1 常见的数学函数 398 2.1.1 求整数的绝对值 398 范例2-1 求整数的绝对值 398 ∷相关函数:abs函数 2.1.2 求长整型整数的绝对值 399 范例2-2 求长整型整数的绝对值 ...

    数据结构(C语言描述)

    3.4.8 小结 96 3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子排序 111 3.8.2 基数...

    程序设计基础(C) 视频.txt

    本章小结30 习题31 第2章数据的输入/输出与控制结构34 2.1键盘输入34 2.2屏幕显示输出35 2.3字符数据的输入输出36 2.3.1字符数据的输入与输出36 2.3.2字符串的输入与输出37 2.4程序基本控制结构38 2.4.1语句的概念38...

Global site tag (gtag.js) - Google Analytics