各种排序算法的实现代码

#include"stdio.h"

#include"malloc.h"

#include"stdlib.h"

typedef int KeyType;

#define MAXSIZE 20

typedef struct

{

KeyType key;

}RedType;

typedef struct

{

RedType r[MAXSIZE+1];

int length;

}SqList,* SQLIST;

void play_choose(void);//显示菜单

void creat_list(SQLIST L) ;//创建顺序表

void traverse_list(SQLIST L);//遍历顺序表

int Search_Seq(SQLIST L,KeyType key);//顺序查找

void InsertSort(SQLIST L);//直接插入排序法

int Search_Bin(SQLIST L,KeyType key);//折半查找

void QSort(SQLIST L,int low,int high);//递归形式的快排

int Partition(SQLIST L,int low,int high);//递归形式的快排的一趟快排执行代码

void SelectSort(SQLIST L);//简单排序法

void Effervesce(SQLIST L);//冒泡排序

void BInsertSort(SQLIST L);//折半插入排序

void main()

{

int i;

int key=67,sum,sum1;

SQLIST L;

L=(SQLIST)malloc(sizeof(SqList));

if(L==NULL)

{

printf("动态内存分配失败!");

exit(-1);

}

play_choose();//显示菜单

while(true)

{

printf("\n\t请选择你要执行的操作:");

scanf("%d",&i);

switch(i)//实现用户选择操作

{

case 1:
creat_list(L);break;//创建顺序表

case 2:
printf("\n\t请选择你要查找的关键字的值:");//顺序查找

scanf("%d",&key);

sum=Search_Seq(L,key);

if(sum!=0)

{

printf("\n\t你要查找的关键字的值与第%d个元素相等\n",sum) ;

}

else

{

printf("\n你要查找的关键字不存在\n");

}

break;

case 3: InsertSort(L);traverse_list(L);break;//直接插入排序法

case 4: QSort(L,1,L->length);traverse_list(L);break;//递归形式的快排

case 5:
SelectSort(L);traverse_list(L);break;//简单排序法

case 6:Effervesce(L);traverse_list(L);break;//冒泡排序

case 7: BInsertSort(L);traverse_list(L);break;//折半插入排序

case 8: printf("\n\t请选择你要查找的关键字的值:");//折半查找

scanf("%d",&key);

Search_Bin(L,key);

sum1=Search_Bin(L,key);

if(sum1!=0)

{

printf("\n\t你要查找的关键字的值与第%d个元素相等\n",sum1) ;

}

else

{

printf("\n\t你要查找的关键字不存在\n");

}

break;

case 9: play_choose();traverse_list(L);break;//清屏显示菜单

case 0:
exit(-1);//退出

default:

printf("\t您输入的是非法值\n");

break;

}

}

}

void play_choose(void)

{

system("cls");

printf("\n\n\n\t\t.......................................\n\n\n");

printf("\t\t      1-建立顺序表           2-顺序查找      \n\n");

printf("\t\t      3-直接插入排序         4-快速排序 \n\n");

printf("\t\t      5-简单选择排序         6-冒泡排序     \n\n");

printf("\t\t      7-拆半插入排序         8-折半查找          \n\n");

printf("\t\t      9-清屏显示菜单         0-退出         \n\n");

printf("\n\n\t\t.......................................  \n\n\n");

}

void creat_list(SQLIST L)//创建顺序表

{

int i;

int val;

int len;

printf("请输入你要建立的顺序表的长度(第一个位置不存储元素):");

scanf("%d",&len);

for(i=1;i<=len;i++)

{

printf("\t请输入第%d个元素的值:",i);

scanf("%d",&val);

L->r[i].key=val;

}

L->length=len;

printf("\n");

printf("\t\t\t恭喜您建表成功\n");

}

void traverse_list(SQLIST L)//遍历顺序表

{

printf("\t\t处理后的数据:   ");

int i;

for(i=1;i<=L->length;i++)

{

printf("%d  ",L->r[i].key);

}

printf("\n");

}

int Search_Seq(SQLIST L,KeyType key)//顺序查找

{

int i;

L->r[0].key=key;

for(i=L->length;L->r[i].key!=key;i--);

return i;

}

void InsertSort(SQLIST L)//直接插入排序法

{

int j,i;

for(i=2;i<=L->length;i++)

{

if(L->r[i].key < L->r[i-1].key)

{

L->r[0]=L->r[i];

L->r[i]=L->r[i-1];

for(j=i-2;L->r[0].key<L->r[j].key;j--)

{

L->r[j+1]=L->r[j];

}

L->r[j+1]=L->r[0];

}

}

}

int Search_Bin(SQLIST L,KeyType key)//折半查找

{

int low=1;

int high=L->length;

int mid;

while(low<=high)

{

mid=(low+high)/2;

if( key==L->r[mid].key)

return mid;

else if(key<L->r[mid].key) high=mid-1;

else low=mid+1;

}

return 0;

}

void QSort(SQLIST L,int low,int high)//递归形式的快排

{

int pivotloc;

if(low<high)

{

pivotloc=Partition(L,low,high);

QSort(L,low,pivotloc-1);

QSort(L,pivotloc+1,high);

}

}

int Partition(SQLIST L,int low,int high)//递归形式的一趟快排

{

int pivotkey;

L->r[0]=L->r[low];

pivotkey=L->r[low].key;

while(low<high)

{

while(low<high && L->r[high].key>=pivotkey) --high;

L->r[low]=L->r[high];

while(low<high && L->r[low].key<=pivotkey) ++low;

L->r[high]=L->r[low];

}

L->r[low]=L->r[0];

return low;

}

void SelectSort(SQLIST L)//简单排序法

{

int k,i,j;

for(i=1;i<=L->length;++i)

{

j=i;

for(k=i+1;k<=L->length;k++)

{

if(L->r[k].key<L->r[j].key)

{

j=k;

}

}

if(i!=j)

{

RedType k=L->r[i];

L->r[i]=L->r[j];

L->r[j]=k;

}

}

}

void Effervesce(SQLIST L)//冒泡排序

{

int i,j;

for(i=1;i<L->length;i++)

{

for(j=1;j<=L->length-i;j++)

{

if(L->r[j].key>L->r[j+1].key)

{

RedType
temp=L->r[j];

L->r[j]=L->r[j+1];

L->r[j+1]=temp;

}

}

}

}

void BInsertSort(SQLIST L)//折半插入排序

{

int i,j,mid;

int low,high;

for(i = 2;i <= L->length;i++)

{

L->r[0]=L->r[i];

low =1;

high = i-1;

while(low <= high)

{

mid = (low+high)/2;

if(L->r[0].key < L->r[mid].key)

high = mid-1;

else

low = mid+1;

}

for(j = i-1;j >=high+1;j--)

L->r[j+1]=L->r[j];

L->r[high+1] = L->r[0];

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 05:15:19

各种排序算法的实现代码的相关文章

Python学习(三) 八大排序算法的实现(下)

本文Python实现了插入排序.基数排序.希尔排序.冒泡排序.高速排序.直接选择排序.堆排序.归并排序的后面四种. 上篇:Python学习(三) 八大排序算法的实现(上) 1.高速排序 描写叙述 通过一趟排序将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整个排序过程能够递归进行,以此达到整个数据变成有序序列. 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全

探讨排序算法的实现

排序算法是我们工作中使用最普遍的算法,常见的语言库中基本都会有排序算法的实现,比如c标准库的qsort,stl的sort函数等.本文首先介绍直接插入排序,归并排序,堆排序,快速排序和基数排序等比较排序算法,然后介绍计数排序,基数排序等具有线性时间的排序算法.本文主要讨论算法的实现方法,并不会过多介绍基本理论. 评价一个排序算法优劣适用与否,一般需要从三个方面来分析 时间复杂度.用比较操作和移动操作数的最高次项表示,由于在实际应用中最在乎的是运行时间的上限,所以一般取输入最坏情况的下的运行时间作为

Python 排序算法的实现

冒泡排序: 1 def bubble(l): 2 length = len(l) 3 for i in range(length): 4 for j in range(i+1, length): 5 if l[i] > l[j]: 6 l[i], l[j] = l[j], l[i] 7 print l 选择排序: 1 def select(l): 2 length = len(l) 3 for i in range(length): 4 minn = i 5 for j in range(i+1

七种排序算法的实现和总结

最近把七种排序算法集中在一起写了一遍. 注释里有比较详细的说明. 1 /*排序算法大集合**/ 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 6 //------------------快速排序------------------// 7 /* 8 核心: 9 如果你知道多少人该站你前面,多少人站你后面,你一定知道你该站哪个位置. 10 算法: 11 1.选取分界数,参考这个分界数,

如何快速正确的写出各种分治算法的实现代码

分治算法大家都很熟悉,很多时候(比如ACM竞赛)当我们判断出一个问题可以用分治算法来解决的时候,却往往因为具体的问题的复杂性,难以很快理清思路,迅速正确地写出问题的分治算法. 因此,要想快速正确的写出分治算法的实现代码,就必须足够的认识分治算法.直接看结论 一.认识分治 在分治策略中,我们递归地解决一个问题,在每层递归中应用如下三个步骤: 1.分解(Divide):将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小. 2.解决(Conquer):递归地求解出子问题.如果子问题规模足够

软考笔记第六天之各排序算法的实现

对于前面的排序算法,用c#来实现 直接插入排序: 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序.第一趟比较前两个数,然后把第二个数按大小插入到有序表中: 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中:依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程.直接插入排序属于稳定的排序,最坏时间复杂性为O(n^2),空间复杂度为O(1).直接插入排序是由两层嵌套循环组成的.外层循环标识并决定待比较的数值.内层循环为待比较数值确定其最终位

常见排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)

这篇博客主要实现一些常见的排序算法.例如: //冒泡排序 //选择排序 //简单插入排序 //折半插入排序 //希尔排序 //归并排序 //双向的快速排序 //单向的快速排序 //堆排序 对于各个算法的实现原理,这里不再多说了,代码中注释较多,结合注释应该都能理解算法的原理,读者也可自己google一下.另外,注释中有很多点,比如边界条件.应用场景等已经用 * 标记,* 越多,越应该多注意. 下面是实现: //冒泡排序 void BubbleSort(int *arr, int n) { if(

各种排序算法的实现和总结(部分原创)

直接上代码: 主程序: #include <iostream> using namespace std; int main() { int a[6]; cout<<"请输入要排序的六个数字:"; //偷个懒,只输入6个数 for(int k=0;k<6;k++) { cin>>a[k]; } cout<<"排序前:"; for(int m=0;m<6;m++) cout<<a[m]<<

排序算法的实现(归并,快排,堆排,希尔排序 O(N*log(N)))

今天跟着左老师的视频,理解了四种复杂度为 O(N*log(N))的排序算法,以前也理解过过程,今天根据实际的代码,感觉基本的算法还是很简单的,只是自己写的时候可能一些边界条件,循环控制条件把握不好. //对于一个int数组,请编写一个选择冒泡算法,对数组元素排序. //给定一个int数组A及数组的大小n,请返回排序后的数组. //测试样例: //[1, 2, 3, 5, 2, 3], 6 //[1, 2, 2, 3, 3, 5] #include <iostream> using namesp