导航:首页 > 源码编译 > 顺序表排序算法

顺序表排序算法

发布时间:2022-08-11 07:53:22

⑴ 线性表的排序法有哪些

说一下我的见解:不一定对 仅供参考

首先 线性表分为顺序表和链式表 其中后者又可分为动态链表和静态链表

这两种链表又可进一步分为:单向无循环 双向无循环 单向有循环 双向有循环

应该说一般的排序算法在单链表都是可以的

插入排序
冒泡排序
选择排序
快速排序
堆排序
归并排序
基数排序
希尔排序

只是在不同的线性表中不同的算法会有效率上的不同
静态链表是比较适合需要做排序的 因为它既具有顺序表的顺序存取功能 又具有链式表易于移动元素的功能

Best Wishes!

⑵ c语言中 顺序表的选择排序是什么

选择排序(Selection sort)是一种简单直观的排序算法。工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
以下是一个实现选择排序的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13

#define SWAP(x, y, t) ((t) = (x), (x) = (y), (y) = (t))
//将list中的n个数据,通过选择排序算法排序。
void selete_sort(int list[], int n)
{
int i, j, min, temp;
for (i = 0; i < n - 1; i++){
min = i;
for (j = i + 1; j < n; j++)//找出最小元素的下标。
if (list[j] < list[min])
min = j;
SWAP(list[i], list[min], temp);//交换最小元素到当前起始位置。

⑶ 常用的数据排序算法有哪些,各有什么特点举例结合一种排序算法并应用数组进行数据排序。

排序简介
排序是数据处理中经常使用的一种重要运算,在计算机及其应用系统中,花费在排序上的时间在系统运行时间中占有很大比重;并且排序本身对推动算法分析的发展也起很大作用。目前已有上百种排序方法,但尚未有一个最理想的尽如人意的方法,本章介绍常用的如下排序方法,并对它们进行分析和比较。

1、插入排序(直接插入排序、折半插入排序、希尔排序);
2、交换排序(起泡排序、快速排序);
3、选择排序(直接选择排序、堆排序);
4、归并排序;
5、基数排序;

学习重点
1、掌握排序的基本概念和各种排序方法的特点,并能加以灵活应用;
2、掌握插入排序(直接插入排序、折半插入排序、希尔排序)、交换排序(起泡排序、快速排序)、选择排序(直接选择排序、堆排序)、二路归并排序的方法及其性能分析方法;
3、了解基数排序方法及其性能分析方法。

排序(sort)或分类

所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。其确切定义如下:
输入:n个记录R1,R2,…,Rn,其相应的关键字分别为K1,K2,…,Kn。
输出:Ril,Ri2,…,Rin,使得Ki1≤Ki2≤…≤Kin。(或Ki1≥Ki2≥…≥Kin)。

1.被排序对象--文件
被排序的对象--文件由一组记录组成。
记录则由若干个数据项(或域)组成。其中有一项可用来标识一个记录,称为关键字项。该数据项的值称为关键字(Key)。
注意:
在不易产生混淆时,将关键字项简称为关键字。

2.排序运算的依据--关键字
用来作排序运算依据的关键字,可以是数字类型,也可以是字符类型。
关键字的选取应根据问题的要求而定。
【例】在高考成绩统计中将每个考生作为一个记录。每条记录包含准考证号、姓名、各科的分数和总分数等项内容。若要惟一地标识一个考生的记录,则必须用"准考证号"作为关键字。若要按照考生的总分数排名次,则需用"总分数"作为关键字。

排序的稳定性

当待排序记录的关键字均不相同时,排序结果是惟一的,否则排序结果不唯一。
在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生变化,则称这种排序方法是不稳定的。
注意:
排序算法的稳定性是针对所有输入实例而言的。即在所有可能的输入实例中,只要有一个实例使得算法不满足稳定性要求,则该排序算法就是不稳定的。

排序方法的分类

1.按是否涉及数据的内、外存交换分
在排序过程中,若整个文件都是放在内存中处理,排序时不涉及数据的内、外存交换,则称之为内部排序(简称内排序);反之,若排序过程中要进行数据的内、外存交换,则称之为外部排序。
注意:
① 内排序适用于记录个数不很多的小文件
② 外排序则适用于记录个数太多,不能一次将其全部记录放人内存的大文件。

2.按策略划分内部排序方法
可以分为五类:插入排序、选择排序、交换排序、归并排序和分配排序。

排序算法分析

1.排序算法的基本操作
大多数排序算法都有两个基本的操作:
(1) 比较两个关键字的大小;
(2) 改变指向记录的指针或移动记录本身。
注意:
第(2)种基本操作的实现依赖于待排序记录的存储方式。

2.待排文件的常用存储方式
(1) 以顺序表(或直接用向量)作为存储结构
排序过程:对记录本身进行物理重排(即通过关键字之间的比较判定,将记录移到合适的位置)

(2) 以链表作为存储结构
排序过程:无须移动记录,仅需修改指针。通常将这类排序称为链表(或链式)排序;

(3) 用顺序的方式存储待排序的记录,但同时建立一个辅助表(如包括关键字和指向记录位置的指针组成的索引表)
排序过程:只需对辅助表的表目进行物理重排(即只移动辅助表的表目,而不移动记录本身)。适用于难于在链表上实现,仍需避免排序过程中移动记录的排序方法。

3.排序算法性能评价
(1) 评价排序算法好坏的标准
评价排序算法好坏的标准主要有两条:
① 执行时间和所需的辅助空间
② 算法本身的复杂程度

(2) 排序算法的空间复杂度
若排序算法所需的辅助空间并不依赖于问题的规模n,即辅助空间是O(1),则称之为就地排序(In-PlaceSou)。
非就地排序一般要求的辅助空间为O(n)。

(3) 排序算法的时间开销
大多数排序算法的时间开销主要是关键字之间的比较和记录的移动。有的排序算法其执行时间不仅依赖于问题的规模,还取决于输入实例中数据的状态。

文件的顺序存储结构表示

#define n l00 //假设的文件长度,即待排序的记录数目
typedef int KeyType; //假设的关键字类型
typedef struct{ //记录类型
KeyType key; //关键字项
InfoType otherinfo;//其它数据项,类型InfoType依赖于具体应用而定义
}RecType;
typedef RecType SeqList[n+1];//SeqList为顺序表类型,表中第0个单元一般用作哨兵
注意:
若关键字类型没有比较算符,则可事先定义宏或函数来表示比较运算。
【例】关键字为字符串时,可定义宏"#define LT(a,b)(Stromp((a),(b))<0)"。那么算法中"a<b"可用"LT(a,b)"取代。若使用C++,则定义重载的算符"<"更为方便。

按平均时间将排序分为四类:

(1)平方阶(O(n2))排序
一般称为简单排序,例如直接插入、直接选择和冒泡排序;

(2)线性对数阶(O(nlgn))排序
如快速、堆和归并排序;

(3)O(n1+£)阶排序
£是介于0和1之间的常数,即0<£<1,如希尔排序;

(4)线性阶(O(n))排序
如桶、箱和基数排序。

各种排序方法比较

简单排序中直接插入最好,快速排序最快,当文件为正序时,直接插入和冒泡均最佳。

影响排序效果的因素

因为不同的排序方法适应不同的应用环境和要求,所以选择合适的排序方法应综合考虑下列因素:
①待排序的记录数目n;
②记录的大小(规模);
③关键字的结构及其初始状态;
④对稳定性的要求;
⑤语言工具的条件;
⑥存储结构;
⑦时间和辅助空间复杂度等。

不同条件下,排序方法的选择

(1)若n较小(如n≤50),可采用直接插入或直接选择排序。
当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;
(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;
堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。这两种排序都是不稳定的。
若要求排序稳定,则可选用归并排序。但本章介绍的从单个记录起进行两两归并的 排序算法并不值得提倡,通常可以将它和直接插入排序结合在一起使用。先利用直接插入排序求得较长的有序子文件,然后再两两归并之。因为直接插入排序是稳定的,所以改进后的归并排序仍是稳定的。

4)在基于比较的排序方法中,每次比较两个关键字的大小之后,仅仅出现两种可能的转移,因此可以用一棵二叉树来描述比较判定过程。
当文件的n个关键字随机分布时,任何借助于"比较"的排序算法,至少需要O(nlgn)的时间。
箱排序和基数排序只需一步就会引起m种可能的转移,即把一个记录装入m个箱子之一,因此在一般情况下,箱排序和基数排序可能在O(n)时间内完成对n个记录的排序。但是,箱排序和基数排序只适用于像字符串和整数这类有明显结构特征的关键字,而当关键字的取值范围属于某个无穷集合(例如实数型关键字)时,无法使用箱排序和基数排序,这时只有借助于"比较"的方法来排序。
若n很大,记录的关键字位数较少且可以分解时,采用基数排序较好。虽然桶排序对关键字的结构无要求,但它也只有在关键字是随机分布时才能使平均时间达到线性阶,否则为平方阶。同时要注意,箱、桶、基数这三种分配排序均假定了关键字若为数字时,则其值均是非负的,否则将其映射到箱(桶)号时,又要增加相应的时间。
(5)有的语言(如Fortran,Cobol或Basic等)没有提供指针及递归,导致实现归并、快速(它们用递归实现较简单)和基数(使用了指针)等排序算法变得复杂。此时可考虑用其它排序。
(6)本章给出的排序算法,输人数据均是存储在一个向量中。当记录的规模较大时,为避免耗费大量的时间去移动记录,可以用链表作为存储结构。譬如插入排序、归并排序、基数排序都易于在链表上实现,使之减少记录的移动次数。但有的排序方法,如快速排序和堆排序,在链表上却难于实现,在这种情况下,可以提取关键字建立索引表,然后对索引表进行排序。然而更为简单的方法是:引人一个整型向量t作为辅助表,排序前令t[i]=i(0≤i<n),若排序算法中要求交换R[i]和R[j],则只需交换t[i]和t[j]即可;排序结束后,向量t就指示了记录之间的顺序关系:
R[t[0]].key≤R[t[1]].key≤…≤R[t[n-1]].key
若要求最终结果是:
R[0].key≤R[1].key≤…≤R[n-1].key
则可以在排序结束后,再按辅助表所规定的次序重排各记录,完成这种重排的时间是O(n)。

⑷ 顺序表的建立、合并、归并算法实现

#include <stdio.h>
#include <malloc.h>

void disp(int *a,int n);
int * create(int n);
int * merger_link(int *a,int *b,int n,int m);
void merge(int *a, int low, int m, int high);
void merge_sort(int *a,int low,int high);

int main()
{
int *a=NULL,*b=NULL,*c=NULL; //顺序表
int n,m;

printf("输入第一个顺序表的大小:\n");
scanf("%d",&n);
a = create(n);

printf("输入第二个顺序表的大小:\n");
scanf("%d",&m);
b = create(m);

printf("合并:\n");
c = merger_link(a,b,n,m);
disp(c,n+m);

printf("归并排序:\n");
merge_sort(c,0,n+m-1);
disp(c,n+m);

if(a) free(a);
if(b) free(b);
if(c) free(c);

return 0;
}

/*建立*/
int *create(int n)
{
int *p,i;
p = (int *)malloc(sizeof(int)*n);
printf("输入顺序表的各个数值(整数,以空格分开):\n");

for(i=0;i<n;i++)
scanf("%d",&p[i]);
return p;
}

/*合并,把两个表连接起来*/
int *merger_link(int *a,int *b,int n,int m)
{
int *p,i=0,j=0;
p = (int *)malloc(sizeof(int)*(n+m));

while(n--)
p[i++] = a[j++];

j=0;

while(m--)
p[i++] = b[j++];

return p;
}

/*将两个有序段合成一个有序段*/
void merge(int *a, int low, int m, int high)
{
int i=low, j=m+1 ,p=0;
int *t;
t = (int *)malloc((high-low+1)*sizeof(int));
while(i<=m && j<=high)
t[p++]=(a[i] <= a[j]) ? a[i++] :a[j++];
while(i <= m)
t[p++]=a[i++];
while(j <= high)
t[p++]=a[j++];
for(p=0, i=low; i<=high; p++,i++)
a[i]=t[p];
free(t);
}

/*归并排序,二路归并*/
void merge_sort(int *a,int low,int high)
{
int mid;
if(low<high)
{
mid = (low+high)/2;
merge_sort(a, low, mid);
merge_sort(a, mid+1, high);
merge(a, low, mid, high);
}
}

/*显示*/
void disp(int *a,int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}

⑸ 排序有几种方法

一. 冒泡排序

冒泡排序是是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把它们交换过来。遍历数列的工作是重复的进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端

1.冒泡排序算法的运作如下:
(1)比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个
(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素还是最大的数
(3)针对所有的元素重复以上的步骤,除了最后一个
二. 选择排序
选择排序是一种简单直观的排序算法。他的工作原理如下:
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置(末尾位置),然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕
选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,他们当中至少有一个将被移到最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动 元素的排序方法中,选择排序属于非常好的一种
三. 插入排序

插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在从后向前扫描的过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间
四. 快速排序
快速排序,又称划分交换排序。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都要小,然后再按此方法对两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
五 希尔排序过程

希尔排序是插入排序的一种,也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
六. 归并排序

归并排序是采用分治法(把复杂问题分解为相对简单的子问题,分别求解,最后通过组合起子问题的解的方式得到原问题的解)的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组

将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,水小九先取谁,取了后相应的指针就往后移一位。然后比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可

⑹ C语言顺序表的基本操作

#include<stdio.h>
#include<stdlib.h>

typedefintDataType;//定义数据数据类型

typedefstruct{
DataType*data;//data指向数据区的首个数据
intlength;//数据长度
}SqList;

voidSort(SqList*L){
inti,j,k;
DataTypetmp;
for(i=0;i<L->length-1;++i){
k=i;
for(j=i+1;j<L->length;++j)
if(L->data[k]>L->data[j])
k=j;
if(k!=i){
tmp=L->data[k];
L->data[k]=L->data[i];
L->data[i]=tmp;
}
}
}

SqList*CreateList(DataTypea[],intn){
inti;
SqList*L;
L=(SqList*)malloc(sizeof(SqList));
L->data=(DataType*)malloc(n*sizeof(DataType));
L->length=n;
for(i=0;i<n;++i)L->data[i]=a[i];
Sort(L);
returnL;
}

intInsertList(SqList*L,DataTypex){
inti,j;
for(i=0;i<L->length;i++){
if(x<=L->data[i]){
for(j=L->length;j>=i;j--)
L->data[j+1]=L->data[j];//结点后移
L->data[i]=x;
L->length++;
return1;
}
}
L->data[L->length++]=x;
return1;
}

intRemoveListElem(SqList*L,DataTyped){
inti,j;
for(i=0;i<L->length;++i){
if(L->data[i]==d){
for(j=i;j<L->length-1;++j)
L->data[j]=L->data[j+1];
L->length--;
return1;
}
}
return0;
}

SqList*AndList(SqList*A,SqList*B){/*A∩B*/
inti,j,k=0;
intlen=(A->length>B->length)?B->length:A->length;
SqList*C=(SqList*)malloc(sizeof(SqList));
C->length=len;
C->data=(DataType*)malloc(len*sizeof(DataType));
for(i=0;i<A->length;++i){
for(j=0;j<B->length;++j){
if(A->data[i]==B->data[j]){
C->data[k++]=A->data[i];
break;
}
}
}
C->length=k;
returnC;
}

SqList*OrList(SqList*A,SqList*B){/*A∪B*/
inti,j,flag;
DataTypee;
SqList*C=(SqList*)malloc(sizeof(SqList));
C->length=A->length+B->length;
C->data=(DataType*)malloc(C->length*sizeof(DataType));
for(i=0;i<A->length;++i)C->data[i]=A->data[i];
for(i=0;i<B->length;++i){
e=B->data[i];
flag=1;
for(j=0;j<C->length;++j){
if(e==C->data[j]){
flag=0;
break;
}
}
if(flag)InsertList(C,e);
}
returnC;
}

voidPrintList(SqList*L){
inti;
for(i=0;i<L->length;++i)
printf("%d",L->data[i]);
printf(" ");
}

voidFreeList(SqList*L){
free(L->data);
free(L);
}

voidmain(){
DataTypex;
DataTypearra[]={36,24,31,5,90,65,70,39,37};
DataTypearrb[]={9,8,43,51,37,89,33,46,29,80,56};
intalen=sizeof(arra)/sizeof(arra[0]);
intblen=sizeof(arrb)/sizeof(arrb[0]);
SqList*A=CreateList(arra,alen);
printf("A线性表为:");
PrintList(A);
SqList*B=CreateList(arrb,blen);
printf("B线性表为:");
PrintList(B);
SqList*C=AndList(A,B);
SqList*D=OrList(A,B);
printf("C=A∩B:");
PrintList(C);
printf("D=A∪B:");
PrintList(D);

printf("在D表中插入数据:");
scanf("%d",&x);
InsertList(D,x);
printf("D表插入x后:");
PrintList(D);

printf("删除D表中数据:");
scanf("%d",&x);
RemoveListElem(D,x);
printf("删除x后的D表为:");
PrintList(D);
FreeList(A);
FreeList(B);
FreeList(C);
FreeList(D);
}

⑺ (C语言数据结构) 设计两个有序顺序表的合并排序算法。

#include
#include
typedef
struct
node//定义结构体
{
int
score;
struct
node
*next;
}node;
node
*create(int
n)//创建链表
{
node
*head,*tail,*p;
head=tail=null;
int
i;
for(i=1;i<=n;i++)
{
p=(node
*)malloc(sizeof(node));
p->next=null;
printf("please
input
%d
score:",i);
scanf("%d",&p->score);
if(head==null)
head=tail=p;
else
{
tail->next=p;
tail=p;
}
}
return
head;
}
node
*range(node
*head)//排序
{
node
*p,*q;
int
score,i,n=0;
p=head;
while(p)
{
n++;
p=p->next;
}
for
(i=0;i
next!=null)//内循环
{
q=p->next;
if
(p->score>q->score)//值交换
{
score=p->score;
p->score=q->score;
q->score=score;
}
p=q;
}
}
return
head;
}
node
*connect(node
*head1,node
*head2)//合并
{
node
*p;
p=head1;
while(p->next!=null)
p=p->next;
p->next=head2;
return
head1;
}
void
output(node
*head)//输出
{
node
*p;
p=head;
while(p)
{
printf("%d
",p->score);
p=p->next;
}
printf("\n");
}
int
main()
{
node
*head,*hea1,*head2;
int
n1,n2;
printf("please
input
a
n1:");//第一个链表的成绩个数
scanf("%d",&n1);
hea1=create(n1);
printf("第一个链表的成绩:");
output(hea1);
printf("please
input
a
n2:");//第二个链表的成绩个数
scanf("%d",&n2);
head2=create(n2);
printf("第二个链表的成绩:");
output(head2);
head=connect(hea1,head2);
head=range(head);
printf("合并后,并排好序:");
output(head);
return
0;
}

⑻ 1.求设计一个算法(用递归实现),实现对一个顺序表的数值排序。最好是用主流语言。谢谢

//归并排序

#include<stdio.h>
#include<string.h>

int num[2000];
int temp[2000];

void merge(int left,int right)
{
int center=(left+right)/2;
int i=left,j=center+1,help=left;
while(i<=center&&j<=right)
{
if(num[i]>num[j])
{
temp[help++]=num[j++];
}
else
{
temp[help++]=num[i++];
}
}
while(i<=center)
{
temp[help++]=num[i++];
}
while(j<=right)
{
temp[help++]=num[j++];
}
for(i=left;i<=right;i++)
num[i]=temp[i];
}

void mergesort(int left,int right)
{
if(right<=left)
return ;
int center=(left+right)/2;
mergesort(left,center);
mergesort(center+1,right);
merge(left,right);
}

//
归并排序算法
合并排序(MERGE SORT)是又一类不同的排序方法,合并的含义就是将两个或两个以上的有序数据序列合并成一个新的有序数据序列,因此它又叫归并算法。它的基本思想就是假设数组A有N个元素,那么可以看成数组A是又N个有序的子序列组成,每个子序列的长度为1,然后再两两合并,得到了一个 N/2 个长度为2或1的有序子序列,再两两合并,如此重复,值得得到一个长度为N的有序数据序列为止,这种排序方法称为2—路合并排序。
例如数组A有7个数据,分别是: 49 38 65 97 76 13 27,那么采用归并排序算法的操作过程如图7所示:
初始值 [49] [38] [65] [97] [76] [13] [27]
看成由长度为1的7个子序列组成
第一次合并之后 [38 49] [65 97] [13 76] [27]
看成由长度为1或2的4个子序列组成
第二次合并之后 [38 49 65 97] [13 27 76]
看成由长度为4或3的2个子序列组成
第三次合并之后 [13 27 38 49 65 76 97]
合并算法的核心操作就是将一维数组中前后相邻的两个两个有序序列合并成一个有序序列。合并算法也可以采用递归算法来实现,形式上较为简单,但实用性很差。合并算法的合并次数是一个非常重要的量,根据计算当数组中有3到4个元素时,合并次数是2次,当有5到8个元素时,合并次数是3次,当有9到16个元素时,合并次数是4次,按照这一规律,当有N个子序列时可以推断出合并的次数是X(2 >=N,符合此条件的最小那个X)。
其时间复杂度为:O(nlogn).所需辅助存储空间为:O(n)

⑼ 顺序表的排序,二分法查找的c语言程序

#include<stdio.h>
int fun(int a[],int n,int key)
{i
nt low,mid,high;//low、mid、high是三个索引分别指向数组的下标low=0;//low指向数组a[]的第一个元素,即下表为0的元素
high=n-1;//lhigh指向数组a[]的最一个元素,即下表为n-1的元素,n为数组的长度
while(low<=high)//循环终止条件是low>high的时候
{
mid=(low+high)/2;//所谓二分查找就在这里,每次都让mid指向数组下标等于low和high之和的一半的元素i
f(key<a[mid])//如果a【mid】大于要查找的元素,说明要查找的元素在low和mid之间,这是需要把high重新置为mid-1
(high=mid-1);//这里应该是{},不能使()吧
else if(key>a[mid])//这里同理,如果a【mid】小于要查找的元素,说明要查找的元素在mid和high之间,这是需要把low重新置为mid+1
(low=mid+1);
else
return mid;//剩下的就是相等的情况,直接返回mid就是查找到的结果
}
return -1;//执行到这一步就说明,low>high,没有找到要查找的元素,返回-1表示没有结果
}
main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int a,b,c;
b=4;
c=fun(a,10,b);
if(c==1)
printf("not found");
else
printf("psition %d\n",c);
}

⑽ 顺序表的排序算法

给你举一些比较常用的排序法:

交换排序法
冒泡排序 | 鸡尾酒排序 | 奇偶排序 | 梳排序 | 侏儒排序 | 快速排序 |臭皮匠算法 | Bogo排序
选择排序法
选择排序 | 堆排序 | Smooth排序 | 笛卡尔树排序 | 锦标赛排序 | 循环排序
插入排序法
插入排序 | 希尔排序 | 二叉查找树排序 | 图书馆排序 | Patience排序
归并排序法
归并排序 | 多相归并排序 | Strand排序
分布排序法
美国旗帜排序 | 珠排序 | 桶排序 | 爆炸排序 | 计数排序 | 鸽巢排序 | 相邻图排序 | 基数排序 | 闪电排序
混合排序法
Tim排序 | 内省排序 | Spread排序 | 反移排序 | J排序
其他
双调排序器 | Batcher归并网络 | 两两排序网络

阅读全文

与顺序表排序算法相关的资料

热点内容
该站点内容加密如何浏览 浏览:931
androidwebview实例 浏览:168
dns服务器不存在怎么解决 浏览:94
谷歌服务器错误怎么弄 浏览:541
中国银行公告在app哪里 浏览:953
计件单价算法 浏览:829
电脑编译程序通不通过怎么回事 浏览:821
程序员眼中只有0和1怎么办 浏览:834
pdf编辑文本 浏览:589
swift在线编程 浏览:67
程序员作假 浏览:899
python采集数据的方法 浏览:620
阿里云服务器释放后警方能查到吗 浏览:111
联通app零钱账户如何获得奖品 浏览:60
循环队列java 浏览:630
linux运维2017 浏览:261
揭阳锦锐单片机方案开发 浏览:515
鸿蒙系统编译安卓app兼容 浏览:44
如何投诉淘客代理app 浏览:697
编译原理中间运算改复写规则 浏览:6