排序算法的应用.
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Status InputElem_Sq(ElemType *e)//输入元素 { printf("Please enter an integer:\n"); scanf("%d",e); return OK; } Status SortList_Sq(SqList *L) { int i,j = 0; ElemType temp = 0; for (i = ListLength_Sq(L) ; i >0 ; i--) { for (j = 0; j < i-1 ; j++) { if (compare_e((L->elem + j + 1),(L->elem + j )) == -1 ) { temp = *(L->elem + j ); *(L->elem + j ) = *(L->elem + j + 1); *(L->elem + j + 1)= temp; } } } return OK; } /*
#include <string.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define INFEASIBLE -1 #define OVERFLOW -2 /* filename:search.h */ #define EQ(a,b) ((a)==(b)) #define LT(a,b) ((a)< (b)) #define LQ(a,b) ((a)<=(b)) /* filename: SqList.h */ #include "head-of-define.h" #define LIST_INIT_SIZE 2 #define LISTINCREMENT 1 typedef int Status ; typedef int ElemType ; typedef struct
ElemType *p = NULL ; ElemType *q = NULL ; if( !L->elem )//判断顺序表元素是否拥有内存空间 { fprintf(stderr,"List is not exists!Please initialize list first!\n"); return ERROR ; } if( i < 0 )//判断i的值是否超出顺序表长度 { fprintf(stderr,"ERROR:Insert Failed!\t Note: No >= 1\n"); return ERROR ; } if( i > ListLength_Sq(L)) { i = ListLength_Sq(L); } ++L->length ; if(ListLength_Sq(L) >= L->listSize )//判断顺序表长度是否够,如 果不够增加长度 { newbase = ( ElemType *)realloc( L->elem ,(L->listSize + LISTINCREMENT)*sizeof(ElemType ) ); if( !newbase ) { exit(OVERFLOW); } L->elem = newbase ; L->listSize += LISTINCREMENT ;
{ ElemType *elem ; int length ; int listSize ; } SqList; Status InitList_Sq( SqList *L) ;//over Status ListEmpty_Sq(const SqList *L) ; int ListLength_Sq(const SqList *L) ; Status ListInsert_Sq( SBiblioteka BaiduList *L , int i ,const ElemType *e) ; Status outElem(const ElemType *e) ; /* 根据实际情况编写 */////输出 数据 Status ListTraverse_Sq(const SqList *L , Status (*outElem)(const ElemType * ) ); Status CreateList_Sq(SqList *L);//over Status InputElem_Sq(ElemType *e);////输入数据 Status SortList_Sq(SqList *L);////排列顺序
filename:DirectInsertionSoft.c */ #include "head-of-define.h" #include "SqList.h" #include "search.h" int InsertSort(SqList *L); int main() { SqList L; CreateList_Sq(&L); ListTraverse_Sq(&L,outElem); printf("\nStart soft the list....\n"); InsertSort(&L); ListTraverse_Sq(&L,outElem); DestroyList_Sq(&L); return OK; } int InsertSort(SqList *L) { int i=0,j=0; int shaobing=0; for (i=1; i<ListLength_Sq(L); i++) { //printf("\nnumber:%d,%d.compare:%d\n",*(L->elem+i),*(L>elem+i-1),LT(*(L->elem+i),*(L->elem+i-1)));
课程名称: 程设计 班级:
算法与数据结构课 指导教师: 信软14 姓名: 学号: 兰德品
实验项目名称: 实验六:排序算法的应用 实验目的及要求: (1)数据元素为整数类型; (2)实现直接插入排序算法。 实验原理: 直接插入排序是一种最简单的排序方法,它的基本操作是将一个记 录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序 表。 直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较 的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待 比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值 开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到 比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。 插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插 到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止。 实验内容(方法和步骤): (1)数据元素为整数类型; (2)实现直接插入排序算法。 /* filename: head-of-define.h */ #include<stdio.h> #include<stdlib.h> #include<malloc.h>
scanf("%d",&i); if ( i >= L->length || i < 1 ) { printf("ERROR:The elem you want to print is inexist!\t Note: No >= 1 and <= %d\n",L->length); } else { (*outElem)( p + i - 1); } printf("\nDo you want to continue?(y or n):"); fflush(stdin); ch = getchar(); }while(ch == 'y'); return OK; } else { for( ; p < q ; p++ ) { ( *outElem)( p ); } return OK; } } Status outElem(const ElemType *e)
if(LT(*(L->elem+i),*(L->elem+i-1))) { shaobing = *(L->elem + i); *(L->elem + i) = *(L->elem + i-1); for (j=i-1; j>=0&<(shaobing,*(L->elem+j)); j--) { *(L->elem + j + 1) = *(L->elem + j); } *(L->elem + j + 1) = shaobing; } } return OK; }
} memset( L->elem , 0x00, LIST_INIT_SIZE*sizeof(ElemType ) ) ; L->length = 0 ; L->listSize = LIST_INIT_SIZE ; printf("Init list true\n"); printf("The list elem is %d\n",*L->elem); printf("The list length is %d\n",L->listSize); return OK; } Status ListEmpty_Sq(const SqList *L)//检测顺序表是否为空 { if( L->length == 0 ) { return TRUE ; } else { return FALSE; } } int ListLength_Sq(const SqList *L)//查询顺序表长度 { return L->length ; } Status ListInsert_Sq ( SqList *L , int i , const ElemType *e) { ElemType *newbase = NULL ;
{ printf("%d\n",*e); return OK ; } Status CreateList_Sq( SqList *L ) { int i = 1; ElemType e = 0; char ch; InitList_Sq( L ); do { InputElem_Sq( &e ); printf("\nPlease enter which place do you want to insert:"); fflush(stdin); scanf("%d",&i); ListInsert_Sq( L , i , &e );//输入元素 printf("Continue ('y' or 'n')\n"); fflush(stdin); ch = getchar() ; //getchar();//老师的代码里有这一句,不是很确定这一语句的用 处,是为了消除回车的影响? }while( ch == 'y' ) ; //SortList_Sq(L); return OK ; }
Status InitList_Sq( SqList *L)//初始化一个空的线性表 { L->elem = (ElemType *) malloc( LIST_INIT_SIZE*sizeof(ElemType ) ) ; if( ListEmpty_Sq(L) ) { exit( OVERFLOW );
} q = L->elem + i ; /* q = &L->elem[i-1] */ for( p = L->elem + ListLength_Sq(L) - 1 ; p > q ; p-- ) { *p = *(p-1) ; } *p = *e ; return OK; } Status ListTraverse_Sq(const SqList *L , Status (*outElem)(const ElemType * ) ) { ElemType *p = NULL ; ElemType *q = L->elem + L->length ; char ch; int i = 0; p = L->elem; printf("Do you want to print the list one by one?(y or n):"); fflush(stdin); ch=getchar(); if (ch == 'y') { do { printf("\nPlease enter which elem do you want to print?: ");