数据结构C语言几种排序

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#define SIZE 30000
typedef int Elemtype;
typedef struct
{
    Elemtype key;
}SQ;
void Shellsort(Elemtype a[],int n,int d[],int number)
{
    int i,j,k,m,span;
    SQ temp;
    for(m=0;m<number;m++)           /*总共要进行number轮排序*/
    {
        span=d[m];               
        for(k=0;k<span;k++)         /*每一轮排序中,全部元素被分为span 个小组*/  
        {
            for(i=k; i+span<n;i+=span)
            {
                temp.key=a[i+span];
                j=i;
                while(j>-1&&temp.key<a[j])
                {
                    a[j+span]=a[j];
                    j-=span;
                }
                a[j+span]=temp.key;
            }
        }
    }
}
void Insertsort(Elemtype a[],int n)
{
    int i,j;
    SQ temp;
    for(i=0;i<n-1;i++)
    {
        temp.key=a[i+1];
        j=i;
        while(j>-1&&temp.key<a[j])
        {
            a[j+1]=a[j];
            j--;
        }
        a[j+1]=temp.key;
    }
}
void Quicksort(Elemtype a[],int low,int high)    /*low,high分别标记待排序元素的起始位置和终止位置*/
{
    int i,j;
    SQ temp;
    i=low,j=high;
    temp.key=a[low];   /*以第一个元素为标准元素*/
    while(i<j)
    {
        while(i<j&&temp.key<=a[j])         /*数组右端扫描*/
            j--;
            if(i<j)
            {
                a[i]=a[j];
                i++;
            }
        
       while(i<j&&a[i]<temp.key)
           i++;
          if(i<j)
          {
              a[j]=a[i];
              j--;
          }
       
       
    }
    a[i]=temp.key;
    if(low<i)  Quicksort(a,low,i-1);         /*对左端集合进行递归*/
    if(i<high) Quicksort(a,j+1,high);        /*对右端集合进行递归*/   
}
void product(Elemtype a[])
{   int i;
       for(i=0;i<30000;i++)
    {    a[i]=rand();
        printf("%10d",a[i]);
        if((i+1)%6==0) printf("\n");
    }
}
int main()
{   Elemtype a[SIZE],b[5]={2500,500,100,20,1};
    clock_t   start,end;              /*typedef long clock_t;*/
    start=clock();/* srand()设置随机种子,time()函数的返回值是作为srand函数的参数的!*/
    product(a);
    Quicksort(a,0,SIZE-1);
    end=clock();
    printf("\n%lf\n",(double)(end-start)/CLOCKS_PER_SEC);  /*常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元*/
    start=clock();
    product(a);
    Insertsort(a,10000);
    end=clock();   printf("\n%lf\n",(double)(end-start)/CLOCKS_PER_SEC);
    start=clock();
    product(a);
    Shellsort(a,10000,b,5);
    end=clock();   printf("\n%lf\n",(double)(end-start)/CLOCKS_PER_SEC);
    return 0;    
}

时间: 2024-08-26 19:28:30

数据结构C语言几种排序的相关文章

算法:常见的几种排序

资料摘自<数据结构C++语言描述> 选择排序 选择排序所遵循的过程来自于我们的经验.幼儿园老师通常用选择法将孩子们按身高排队.对以随机顺序排列的一组学生,老师反复从组中挑选出最矮的学生并将他或她移到正在形成的按高矮个排列的队列中.这一过程一直持续到所有学生都被移动到有序队列中,如下所示: //用选择排序算法对类型为T的n元数组进行排序 template<class T> void SelectionSort(T A[], int n){ //每遍循环中最小元素的下标 int sma

数据结构:图论:拓扑排序! 两种方法!

拓扑排序:(1)由偏序变成全序的过程!直观的说,偏序指集合中仅有部分成员之间可比较!而全序指集合中全体成员之间均可比较! (2)将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前. 数据结构中进行拓扑排序的方法: 方法一: (1)在有向图中选一个没有前驱的顶点且输出之! (2)从图中删除该顶点和所有以它为尾的弧. (3)重复上述两部,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止.后一种情况说明有向图中存在环! 代码: #

c语言常见的几种排序方法总结

一:选择排序和冒泡排序 这两种排序比较简单,直接贴出代码: 1 #include <stdio.h> 2 3 void choose_sort(int *arr, int n); 4 void bubble_sort(int *arr, int n); 5 void show(int *arr, int n); 6 7 int main() 8 { 9 int arr[10] = {10, 8, 3, 15, 18, 16, 11, 9, 7, 6}; 10 11 /*选择排序*/ 12 ch

模板化的七种排序算法,适用于T* vector&lt;T&gt;以及list&lt;T&gt;

最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板纯属于偷懒,更方便于测试代码的有效性,等代码写完也懒得去改了.下面开始介绍这段代码,有什么不对的地方欢迎前来指正. 一共写了七种排序,插入排序InsertSort.堆排序HeapSort.快速排序QuickSort.合并排序MergeSort,计数排序CountingSort,基数排序RadixSo

实现基于数据结构的语言

创建任何 DSL 都应该从定义需要解决的问题开始.这里,我们需要定义一个 DSL 库(有时也称为组合库,combinators library),用于二维图形,这是一个很明显的选择.这个示例演示如何用大量简单的基本图形构建出复杂的结构.在计算机屏幕上的图像本质上就是线条和多边形的集合,尽管显示出来的图形可能极其复杂.这个示例用四个模块表现:第一,清单 12-1,提供创建图片的基本操作(primitives):第二,清单12-2,如何实现解释图片:清单 12-3 和清单 12-4 用示例演示如何使

数据结构基础温故-7.排序

排序(Sorting)是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为按关键字“有序”的记录序列.如何进行排序,特别是高效率地进行排序时计算机工作者学习和研究的重要课题之一.排序有内部排序和外部排序之分,若整个排序过程不需要访问外存便能完成,则称此类排序为内部排序,反之则为外部排序.本篇主要介绍插入排序.交换排序.选择排序和归并排序这几种内部排序方法. 首先,我们今天的目标就是编写一个SortingHelper类,它是一个提供了多种排序方法的帮助类,后面我们的目标就是实现其中

八种排序算法效率比较

从刚上大一那会儿学的C语言开始,就已经接触到了不少排序算法,但当时都只是为了完成简单的排序任务而已,而且所给的数据也不够多,所以看不出各个排序算法间的执行效率的优劣.最近有个数据结构课程设计的实验,是有关于排序算法之间的效率比较,我就顺便把它放上来了,并对各个算法执行的效率时间做了柱形统计图表.此次实验主要测试了8种排序算法:插入排序.快速排序.冒泡排序.希尔排序.简单选择排序.堆排序.归并排序.折半插入排序. 总共建立了三种情况,分别是平均排序.最好情况排序.最坏情况排序.第一种情况就是使用了

数据结构C语言实现介绍

刚刚结束的大二上学期学习了数据机构C语言版这门课,在接下来的一个月中准备把课程的代码和知识点总结一下,就有了这个专题:数据结构C语言实现,在这里我将用C语言实现最基本的数据结构以及一些基本的算法,以下是我这个专题的内容: 1. 数据结构及算法简介: 主要介绍数据结构及算法的基础知识,一些基本的概念和术语,以及算法的定义.算法的特性.算法的时间复杂度和空间复杂度 2.顺序表的定义及算法实现: 主要介绍顺序表的定义及特点,实现顺序表的存储结构以及基本操作 3.单链表的定义及算法实现:  主要介绍单链

《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

先附上文档归类目录: 课本源码合辑  链接??? <数据结构>课本源码合辑 习题集全解析  链接??? <数据结构题集>习题解析合辑 博主有话说: 01.自学编程,难免思路阻塞,所以从今天起,我(StrayedKing)决定在本博客陆续更新严蔚敏,吴伟民版<数据结构-C语言版>各章节的课本源码和配套习题集答案解析,目的是为了整理数据结构中的知识点,并与网友交流意见,集思广益,共同进步.        ★注★ 左侧随笔分类下用两个栏目:<课本源码>.<习