`
as1001001
  • 浏览: 89953 次
  • 性别: Icon_minigender_1
  • 来自: 鞍山
社区版块
存档分类
最新评论

常用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; /*是k总是指向最小元素*/ 
if(i!=k) { /*当k!=i是才交换,否则a[i]即为最小*/ 
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++; /* 从左到右找比k大的元素*/ 
while(a[ 
  n]>k&&n>i) n--; /* 从右到左找比k小的元素*/ 
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]; /*temp为要插入的元素*/ 
j=i-1; 
while(j>=0&&temp<a[j]) { /*从a[i-1]开始找比a[i]小的数,同时把数组元素向后移*/ 
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; /*缩小间距值*/ 
} 
} 


上面我们已经对几种排序法作了介绍,现在让我们写个主函数检验一下。

#include<stdio.h>

/*下面的"..."代表函数体,自己加上去!*/
void bubble(int *a,int n)
{
...
}
void choise(int *a,int n)
{
...
}
void quick(int *a,int i,int j)
{
...
}
void insert(int *a,int n)
{
...
}
void shell(int *a,int n)
{
...
}

/*为了打印方便,我们写一个printf 吧。*/
void print(int *a,int n)
{
int i;
for(i=0;i<n;i++)
printf("%5d",a[i]);
printf("\n");
}


本文来自CSDN博客http://blog.csdn.net/hardwin/archive/2008/04/09/2270816.aspx
分享到:
评论

相关推荐

    常用C语言排序算法试验

    本资源“常用C语言排序算法试验”聚焦于C语言实现的各种常见排序算法,是提升编程技能和理解算法原理的重要实践。 排序算法是计算机科学中的基础组成部分,它在数据处理、数据库管理和许多其他应用中起着关键作用。...

    常用C语言排序算法解析.pdf

    在C语言中,排序算法是学习程序设计的一个重点问题,因此,本文将对几种常用的C语言排序算法进行详细解析。 首先,顺序比较排序法是一种基本的排序算法。它的核心思想是通过多趟比较和交换,逐步将数组中的元素按照...

    浅析基于C语言的常用排序算法比较.pdf

    插入排序算法同样是基于C语言的一种常用排序算法。插入排序的基本思想是:把待排序的序列分为已排序和未排序两部分,每次将一个未排序的元素,按照其大小插入到已排序序列中的适当位置,直到所有元素都被插入。插入...

    各种常用排序算法的C语言实现

    本资源提供了各种常用排序算法的C语言实现,源自严蔚敏的经典教材《数据结构》。下面将详细介绍这些排序算法及其在C语言中的实现原理。 1. 冒泡排序(Bubble Sort) 冒泡排序是最基础的排序方法,通过不断交换相邻...

    用C语言实现常用排序算法

    本项目旨在实现并比较六种经典的排序算法——直接插入排序、折半插入排序、起泡排序、简单选择排序、堆排序以及2-路归并排序,使用C语言编程。为了全面评估这些算法,我们将在一组随机生成的30000个整数上运行它们,...

    几种常用排序算法的C语言实现

    一些常用排序算法的C语言实现,包括直接选择排序,希尔排序,直接插入排序,快速排序,归并排序,冒泡排序,堆排序

    C语言常用排序算法

    C语言常用排序算法 在计算机科学中,排序算法是指将一组无序的数据按照某种顺序排列的方法。排序算法是编程语言中非常重要的一部分,特别是在C语言中。下面将介绍几种常用的排序算法,包括选择排序、插入排序等。 ...

    常用排序算法java演示

    本文将深入探讨标题"常用排序算法java演示"中涉及的知识点,包括排序算法的原理、Java实现方式以及其在实际应用中的图形演示。 首先,让我们逐一了解几种常见的排序算法: 1. **冒泡排序(Bubble Sort)**:这是一...

    常用排序算法C语言示例代码解说PDF

    个人原创总结的常用排序算法C语言示例代码解说PDF,可以动态输出排序过程,以便理解排序算法的主旨思想。包含有直接插入排序,折半插入排序,2路直接插入排序,起泡排序,简单选择排序,快速排序,堆排序,(希尔排序,归并...

    C语言常用排序方法, 动画演示

    在编程世界中,C语言是一种基础且强大的编程语言,它被广泛用于系统编程、软件开发以及各种算法实现,包括排序算法。排序是计算机科学中一个基础但至关重要的概念,它涉及将一组数据按照特定顺序进行排列。在这个...

    常用排序算法C语言实现

    本资源"常用排序算法C语言实现"提供了一个实践平台,帮助学习者将理论知识转化为实际代码。 首先,让我们探讨几种常见的排序算法及其C语言实现: 1. **冒泡排序(Bubble Sort)**:冒泡排序是最基础的排序方法,...

    c语言常用排序算法源码

    C语言作为基础且广泛应用的编程语言,提供了实现各种排序算法的可能。以下将详细讲解标题和描述中提到的几种常见排序算法:插入排序、Shell排序以及堆排序。 1. 插入排序 插入排序是最直观的排序算法之一。它通过...

    C++实现常用排序算法

    在编程领域,排序算法是计算机科学中的基础但至关重要的部分,尤其在C++这样的系统级编程语言中。本文将深入探讨C++实现的几种常见排序算法:冒泡排序、选择排序、插入排序、归并排序、快速排序以及堆排序。 1. **...

    C语言常用排序算法.pdf

    C语言常用排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等。下面将对这些经典的排序算法进行详细介绍。 1. 冒泡排序(Bubble Sort) 冒泡排序是最简单的排序算法之一,通过不断交换相邻的...

    C语言数据结构内部排序算法及比较

    在计算机科学领域,数据结构和排序算法是编程基础的重要组成部分,特别是对于C语言这样底层而强大的编程工具。本文将深入探讨“C语言数据结构内部排序算法及比较”这一主题,结合个人课程作业的经验,对一些核心概念...

    +c语言选择排序算法c语言排序算法 (2).pdf

    2. **分组**:将所有记录按增量t分组,对每组使用直接插入排序算法排序。 3. **递减增量**:用下一个较小的增量重复上一步,直到增量为1,此时整个数组被完全排序。 希尔排序的关键在于增量序列的选择,不同的序列...

    C语言常用算法(很全,内有详细例子)

    常用算法一 一、计数、求和、求阶乘等简单算法 此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。 例:计算 直到最后一项的绝对值小于1e-7时...

    C语言常用排序原理和算法全解

    在计算机科学中,排序算法有很多种,今天我们将讨论C语言中常用的排序原理和算法。 一、稳定排序和非稳定排序 稳定排序和非稳定排序是两种不同的排序方法。稳定排序是指在排序过程中,所有相等的数经过某种排序...

Global site tag (gtag.js) - Google Analytics