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

排序是数据结构中常考的内容,本文对几种常用的排序进行了整理,以便查看。

首先定义要进行排序的数组
#define MAXSIZE 10
#include<stdio.h>

typedef struct
{
    int a[MAXSIZE];
    int length;
}List;
打印数组函数

void Print(List *L)
{
    int i;
    for(i=0; i<L->length; i++)
        printf("%d ", L->a[i]);
    printf("\n");
}
交换函数

void swap(List *L, int i, int j)
{
    int tmp = L->a[i];
    L->a[i] = L->a[j];
    L->a[j] = tmp;
}
选择排序

/***********选择排序***********
void SelectSort(List *L)
{
    int i, j;
    int min;
    for(i=0; i<L->length; i++)
    {
        min = i;
        for(j=i; j<L->length; j++)
        {
            if(L->a[min]>L->a[j])
            {
                min = j;
            }
        }
        if(i != min)
            swap(L, i, min);
    }

}
选择排序
/***********插入排序***********/
void InsertSort(List *L)
{
    int i, j;
    for(i=1; i<L->length; i++)
    {
        if(L->a[i] < L->a[i-1])
        {
            int key = L->a[i];
            for(j=i-1; L->a[j]>key && j>=0; j--)
                L->a[j+1] = L->a[j];
            L->a[j+1] = key;
        }
    }
}

/***********希尔排序***********/
void ShellSort(List *L)
{
    int i, j;
    int increment = L->length;
    do
    {
        increment = increment/3;
        for(i=increment; i<L->length; i++)
        {
            if(L->a[i]<L->a[i-increment])
            {
                int tmp = L->a[i];
                for(j=i-increment; j>=0&&tmp<L->a[j]; j-=increment)
                    L->a[j+increment]=L->a[j];
                L->a[j+increment] = tmp;
            }
        }
    }while(increment);
}
快速排序
/***********快速排序***********/

int Partation(List *L, int low, int high)
{
    int key = L->a[low];
    while(low<high)
    {
        while(low<high && key<=L->a[high])
            high --;
        swap(L, low, high);
        while(low<high && key>=L->a[low])
            low ++;
        swap(L, low, high);
    }
    return low;
}


void QuickSort(List *L, int low, int high)
{
    int mid;
    if(low<high)
    {
        mid = Partation(L, low, high);
        QuickSort(L, low, mid-1);
        QuickSort(L, mid+1, high);
    }
}

/************希尔排序***********/
主函数
/*************主函数***********/
int main()
{
    List L = {{9, 5, 3, 1, 2, 6, 7, 4, 8}, 9};
    InsertSort(&L);
//    ShellSort(&L);
//    QuickSort(&L);
//    SelecttSort(&L);
//    Print(&L);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《数据结构》(C语言版)<br>算法源码及运行演示系统使用说明<br>一、启动演示系统<br>双击演示系统应用程序文件“DS_VC_ALGO.EXE”启动演示系统,出现图1所示界面。<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>图1 《数据结构》(C语言版)算法源码及运行演示系统主界面<br>二、演示系统使用步骤<br>除了个别算法之外,演示系统给出了《数据结构》(C语言版)书中算法对应的程序代码(CPP文件)和测试运行程序(VC++6.0的EXE文件)。通过本系统,可以显示算法的源代码以及运行结果。具体操作步骤如下:<br>1.选择相应章<br>单击演示系统界面右侧章选择按钮。<br>例如,要选择第6章,则单击“第6章”选择按钮。<br>当相应章被选择后,窗口的右侧部分将列出本章的算法选择按钮。<br>例如,选择第6章后,窗口的右侧部分将显示第6章中的算法6.1-6.13和6.15的选择按钮。由于书中的算法6.14和6.16只是示意性算法,故未给出源码,其按钮上的文字为灰色,处于“无效”状态。<br>2.选择相应章中的算法<br>单击窗口右侧部分所列举的本章某个算法选择按钮,被选择的算法的源码将在窗口左侧空白区域中显示。对于较长的源码,单击显示区域后,可用键盘的光标键和翻页键浏览源码。<br> 例如,选择了第6章中的算法6.5后界面如图2所示:<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>图2 选择算法6.5<br>3.运行测试程序<br>单击窗口上部的“运行”按钮,将弹出运行窗口,运行所选算法的测试程序。若运行按钮为灰色,表示该算法无单独测试程序。<br> 例如,算法6.5的测试运行窗口如图3所示:<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>图3 测试运行窗口<br>测试运行说明:<br>测试运行窗口显示程序的执行过程及结果。若在显示过程中出现运行窗口无法正常演示的情况,只需调节运行窗口大小即可正常显示(调节最小化按钮或窗口最大化/还原按钮“ ”)。<br>三、退出演示系统<br>使用完毕后,单击窗口右上角关闭按钮“ ”退出演示系统。<br>四、测试程序示例<br>在《数据结构》的课程教学中,各抽象数据类型的设计与实现是重要的学习和实践环节。为此,本系统只给出了各算法源码的测试程序的可执行文件。在此,给出算法6.5的测试程序示例,以供参考。<br>算法6.5是中序遍历线索二叉树的非递归算法,要对其源码进行测试,可首先调用算法6.6及6.7建立中序线索二叉树。以下是测试程序的源码,相关类型和辅助函数定义在文件include06.h和include06.cpp中,此略。<br>
算法:C语言实现 (第1-4部分)基础知识、数据结构、排序及搜索(原书第3版) 本书是Sedgewick彻底修订和重写的C算法系列的第一本。全书分为四部分,共16章。第一部分“基础知识”(第1—2章)介绍基本算法分析原理。第二部分“数据结构”(第3~5章)讲解算法分析中必须掌握的数据结构知识,主要包括基本数据结构、抽象数据结构、递归和树。第三部分“排序”(第6~11章)按章节顺序分别讨论基本排序方法(如选择排序、插入排序、冒泡排序、希尔排序等)、快速排序方法、归并和归并排序方法、优先队列与堆排序方法、基数排序方法以及特殊用途的排序方法,并比较了各种排序方法的性能特征。第四部分“搜索”(第12~16章)在进一步讲解符号表、树等抽象数据类型的基础上,重点讨论散列方法、基数搜索以及外部搜索方法。 书中提供了用C语言描述的完整算法源程序,并且配有丰富的插图和练习。作者用简洁的实现将理论和实践成功地结合了起来,这些实现均可在真实应用上测试,使得本书自问世以来备受程序员的欢迎。 本书可作为高等院校计算机相关专业算法与数据结构课程的教材和补充读物,也可供自学之用。 目录 出版者的话 译者序 前言 第一部分 基础知识  第1章 引言   1.1 算法   1.2 典型问题——连通性   1.3 合并一查找算法   1.4 展望   1.5 主题概述  第2章 算法分析的原理   2.1 实现和经验分析   2.2 算法分析   2.3 函数的增长   2.4 大O符号   2.5 基本递归方程   2.6 算法分析示例   2.7 保证、预测及局限性 第二部分 数据结构  第3章 基本数据结构   3.1 构建组件   3.2 数组   3.3 链表   3.4 链表的基本处理操作   3.5 链表的内存分配   3.6 字符串   3.7 复合数据结构  第4章 抽象数据类型   4.1 抽象对象和对象集   4.2 下推栈ADT   4.3 栈ADT客户示例   4.4 栈ADT的实现   4.5 创建一个新ADT   4.6 FIFO队列和广义队列   4.7 复制和索引项   4.8 一级ADT   4.9 基于应用的ADT示例   4.10 展望  第5章 递归与树   5.1 递归算法   5.2 分治法   5.3 动态规划   5.4 树   5.5 树的数学性质   5.6 树的遍历   5.7 递归二叉树算法   5.8 图的遍历   5.9 综述 第三部分 排序  第6章 基本排序方法   6.1 游戏规则   6.2 选择排序   6.3 插入排序   6.4 冒泡排序   6.5 基本排序方法的性能特征   6.6 希尔排序   6.7 对其他类型的数据进行排序   6.8 索引和指针排序   6.9 链表排序   6.10 关键字索引统计  第7章 快速排序   7.1 基本算法   7.2 快速排序算法的性能特征   7.3 栈大小   7.4 小的子文件   7.5 三者取中划分   7.6 重复关键字   7.7 字符串和向量   ……  第8章 归并与归并排序  第9章 优先队列和堆排序  第10章 基数排序  第11章 特殊用途的排序方法 第四部分 搜索  第12章 符号表和二叉搜索树  第13章 平衡树  第14章 散列  第15章 基数搜索  第16章 外部搜索
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值