数据排序的几种方法c语言实现
数据排序的几种方法(c语言实现) /* 功能:用以下几种方法实现c语言中的常用排序 选择排序 冒泡排序 插入排序 快速排序 堆排序 归并排序 基数排序 希尔排序 */ #include <stdio.h> void select_Sort1(int a[],int n); void select_Sort2(int a[],int n); void bubble_Sort(int a[],int n); void insert_Sort(int a[],int n); void quick_Sort(int a[],int low,int high); int findpos(int a[],int low,int high); int main() { int a[10]; int i; printf("please enter ten int number:\n"); for(i=0;i<10;i++) { scanf("%d",&a[i]); } //select_Sort2(a,10); //bubble_Sort(a,10); //insert_Sort(a,10); quick_Sort(a,0,9); printf("after sorted:\n"); for(i=0;i<10;i++) { printf("%5d",a[i]);
} return 0; } //===========================第一种方法:选择排序法======================================= //用一种较为容易理解的方法实现选择排序 void select_Sort1(int a[],int n) { int i,j,k; //外部循环从小到大,依次找出各位置上的值(最后一个位置上的值除外,因为在循环的过程中各个位置上的值逐渐确定下来,最后一个值自然就确定了) for(i=0;i<n-1;i++) { //内部循环从外部循环指针的下一个位置开始,将后续位置上取到的值逐渐与外部循环所对应的指针上的值进行比较 for(j=i+1;j<n;j++) { if(a[j]<a[i]) { // 找到比该位置上的值小的值就进行一次交换 k=a[i]; a[i]=a[j]; a[j]=k; } } } } //以下方法实现起来效率更高,之所以效率高是因为找到一个比外循环指针所对应值更小的值时没有马上交换而是把位置先记录下来,内循环结束后再交换 void select_Sort2(int a[],int n) { int i,j,k,t; //外部循环从小到大,依次找出各位置上的值(最后一个位置上的值除外,因为在循环的过程中各个位置上的值逐渐确定下来,最后一个值自然就确定了) for(i=0;i<n-1;i++) { //内部循环从外部循环指针的下一个位置开始,将后续位置上取到的值逐渐与外部循环所对应的指针上的值进行比较 k=i;//k的作用是记录内部指针一趟比较下来,哪个位置所对应的值比外指针所对应的值小,将该位置存放到k中,默认情况下k的值是外指针对应位置 for(j=i+1;j<n;j++) {
C语言常用排序算法
/* ===================================================================== ======== 相关知识介绍(所有定义只为帮助读者理解相关概念,并非严格定义): 1、稳定排序和非稳定排序 简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就 说这种排序方法是稳定的。反之,就是非稳定的。 比如:一组数排序前是a1,a2,a3,a4,a5,其中a2=a4,经过某种排序后为 a1,a2,a4,a3,a5, 则我们说这种排序是稳定的,因为a2排序前在a4的前面,排序后它还是在a4的前面。假如变成a1,a4, a2,a3,a5就不是稳定的了。 2、内排序和外排序 在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序; 在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。 3、算法的时间复杂度和空间复杂度 所谓算法的时间复杂度,是指执行算法所需要的计算工作量。 一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。 ===================================================================== =========== */ /* ================================================ 功能:选择排序 输入:数组名称(也就是数组首地址)、数组中元素个数 ================================================ */ /* ==================================================== 算法思想简单描述:
c语言数组习题
数组练习解答 1 定义一个名为a的单精度实型一维数组,长度为4,所有元素的初值均为0的数定义语句是___________ 【分析】按照一般数据定义语句的格式,可以直接写出方法一(参看答案);考虑到所有元素均赋初值时可以省略数组长度,可以写出方法二(参看答案);考虑到不省略数组长度,给部分元素赋初值时,所有未赋初值的元素均有空值(对数值型数组来说,初值为0),可以写出方法三(参看答案);考虑到选用静态型,不赋初值所有元素也自动赋予。空值(对数值型数组来说,初值为0),可以写出方法四(参看答案)。 【答案】方法一:float a[4]={0.0,0.0,0.0,0.0}; 方法二:float a[]={ 0.0,0.0,0.0,0.0}; 方法三:float a[4]= {0.0}; 方法四: static float [4]; 2 下列数组定义语句中,错误的是() ① char x[1]='a';②auto char x[1]={0}; ③ static char x[l];④ char x[l]; 【分析】显然答案①中给字符型数组赋初值的格式不对(不能直接赋予字符常量,必须用花括号括住),所以备选答案①是符合题意的答案。 【答案】① 3 用"冒泡排序法"对n个数据排序,需要进行n一1 步。其中第k步的任务是:自下而上,相邻两数比较,小者调上;该操作反复执行n-k次。现在假设有4个数据:4、l、3、2要排序,假定4为上、2为下,则利用"冒泡排序法"执行第2步后的结果是_________________。 【分析】开始排序前的排列执行第1步后的排列执行第2步后的排列 4 1 1 1 4 2 3 2 4 2 3 3 【答案】 l、2、4、3 4 用"选择排序法"对n个数据排序,需要进行n-1步。其中第k步的任务是:在第k个数据到第n个数据中寻找最小数,和第k个数据交换。现在假设有4个数据:4、1、3、2要排序,则利用"冒泡排序法"执行第2步后的结果是______________________。 【分析】开始排序前的排列为: 4 1 3 2 执行第1步后的排列为: 1 4 3 2 执行第2步后的排列为: 1 2 3 4 【答案】1、2、3、4 5 下列数组定义语句中,正确的是() ① int a[][]={1,2,3,4,5,6};② char a[2]「3]='a','b'; ③ int a[][3]= {1,2,3,4,5,6};④ static int a[][]={{1,2,3},{4,5,6}}; 【分析】C语言规定,二维数组定义时不允许省略第二维的长度,所以备选答案①④是错误的。C语言还规定,定义字符型数组时不允许直接使用"字符常量"的方式赋初值,所以备选答案②也是错误的。显然备选答案③符合题意。【答案】③ 6 定义一个名为"s"的字符型数组,并且赋初值为字符串"123"的错误语句是() ①char s[]={‘1','2','3','\0 '};②char s「」={"123"}; ③char s[]={"123\n"}; ④ char s[4]={'1','2','3'}; 【分析】备选答案①中省略了数组长度,所以每个元素都赋了初值,共计4个元素,初值依次为'l'、'2'、'3'、'\0',最后一个元素的值为字符串结束标记,所以数组S中存放的是字符串"123",该答案不符合题意(即正确的);备选答案③中直接赋予字符串作为初值所以数组s的长度为4,其中的初值是字符串"123",不符合题意(即正确的);备选答案③中也是给数组s赋予字符串的初值,但是字符串不是"123",而是"123\n",所以该答案符合题意(即错误的);显然答案④也不符合题意(即正确的)。下面来分析答案④为什么是正确的,该答案给出了数组长度为4,赋初值时仅给前3个元素赋予字符'1 '、 '2'、'3',第 4个元素没有赋初值,按照C语言的规定,也有初值,且初值为空值,对字符型数组来说,空值就是'\0',即字符率结束标记,所以数组S中存放的也是字符串" 123"。【答案】③
各种排序算法C语言实现
#include #include #define Max 20 //最大顶点数 //顺序存储方式使用的结构体定义 typedef struct vexType { char data; int indegree; }Vex; typedef struct Graph { int vexnum; //顶点数量 int arcnum; //边数 Vex vex_array[Max]; //存放顶点的数组 int arc_array[Max][Max]; //存放邻接矩阵的二维数组}Graph; //图的定义 //链式存储使用的结构体定义 typedef struct arcType { char vex1,vex2; //边所依附的两点 int arcVal; //边的权值 }Arc; //边的定义 typedef struct LinkType { int index; //在顶点表的下标 struct LinkType *nextarc; //指向下一个顶点结点 }LinkNode; //边表定义 typedef struct vexNode { char data; int add; //在顶点数组的下表位置 LinkNode *firstarc; //指向边表的第一个结点
int indegree; //入度 }VexNode; //顶点边定义 typedef struct LGraph { VexNode vex_array[Max]; //顶点数组 int vexnum; //图中顶点数 }LGraph; /*函数功能:图的创建 入口参数:图G 返回值:无 */ void Creat_G(Graph *G) { char v; int i=0; int j=0; G->vexnum=0; printf("输入说明。。。有权值请输入权值,无权值请输入1,无边请输入0\n"); printf("\n请输入所有顶点(不超过20个,按‘#’结束输入):\n"); do{ printf("输入第%d 个顶点:",G->vexnum+1); scanf(" %c",&v); G->vex_array[G->vexnum].data = v; G->vexnum++; }while(v!='#'); G->vexnum--; printf("输入邻接矩阵(%d * %d):",G->vexnum,G->vexnum); for(i=0; ivexnum; i++) { printf("输入%c 到以下各点的权值:\n",G->vex_array[i].data); for(j=0; jvexnum; j++) { printf("<%c, %c>: ",G->vex_array[i].data,G->vex_array[j].data); scanf("%d",&G->arc_array[i][j]); }
C语言数组排序题目
92.下列程序的功能是:将一正整数序列{K1,K2,…,K9}重新排成一个新的序列。新序列中,比K1小的数都在K1的左面(后续的再向左存放),比K1大的数都在K1的右面(后续的再向右存放),从K1向右扫描。要求编写函数jsValue()实现此功能,最后调用函数writeDat()把新序列输出到文件OUT.DAT中。 说明在程序中已给出了10个序列,每个序列中有9个正整数,并存入数组a[10][9]中,分别求出这10个新序列。 例如:序列排序前{6,8,9,1,2,5,4,7,3} 序列排序后{3,4,5,2,1,6,8,9,7} 注意:部分源程序存放在PROG1.C中。请勿改动主函数main()和写函数writeDat()的内容。 【试题程序】 #include void writeDat(); void jsValue(int a[10][9]) { } void main() { int a[10][9]={{6,8,9,1,2,5,4,7,3}, {3,5,8,9,1,2,6,4,7}, {8,2,1,9,3,5,4,6,7}, {3,5,1,2,9,8,6,7,4}, {4,7,8,9,1,2,5,3,6}, {4,7,3,5,1,2,6,8,9}, {9,1,3,5,8,6,2,4,7}, {2,6,1,9,8,3,5,7,4}, {5,3,7,9,1,8,2,6,4}, {7,1,3,2,5,8,9,4,6}, }; int i,j; jsValue(a); for(i=0;i<10;i++) {
for(j=0;j<9;j++) { printf("%d",a[i][j]); if(j<=7) printf(","); } printf(" ) \n" } writeDat(a); } void writeDat(int a[10][9]) { FILE *fp; int i,j; fp=fopen("OUT.DA T","w"); for(i=0;i<10;i++) { for(j=0;j<9;j++) { fprintf(fp,"%d",a[i][j]); if(j<=7) fprintf(fp,","); } fprintf(fp,"\n"); } fclose(fp); } 【解题思路】此题属于排序问题。通过对问题的分析,得出解本题的思路为:利用嵌套的循环实现对二维数组每个元素的访问,对于每一行,将第1个数取出依次同后面的数进行比较,后面的数如果更小,则将后面的数取出,将这个数据左侧的数依次向右移动,然后将这个数放在最左侧。这样,扫描完一行后,比第1个数小的数就在第1个数的左侧,而比它大的数则在其右侧。 【参考答案】 void jsValue(int a[10][9]) { int i,j,k; /*循环控制变量*/ int num,temp; /*定义暂存变量*/ for(i=0;i<10;i++) /*逐行取数进行处理*/ { num=a[i][0]; /*暂存一行的第一个元素*/
c语言实现简单排序(8种方法)
#include #include //冒泡排序 voidbubleSort(int data[], int n); //快速排序 voidquickSort(int data[], int low, int high); intfindPos(int data[], int low, int high); //插入排序 voidbInsertSort(int data[], int n); //希尔排序 voidshellSort(int data[], int n); //选择排序 voidselectSort(int data[], int n); //堆排序 voidheapSort(int data[], int n); void swap(int data[], inti, int j); voidheapAdjust(int data[], inti, int n); //归并排序 voidmergeSort(int data[], int first, int last); void merge(int data[], int low, int mid, int high); //基数排序 voidradixSort(int data[], int n); intgetNumPos(intnum, intpos); int main() { int data[10] = {43, 65, 4, 23, 6, 98, 2, 65, 7, 79}; inti; printf("原先数组:"); for(i=0;i<10;i++) { printf("%d ", data[i]); } printf("\n"); /*printf("冒泡排序:"); bubleSort(data, 10); for(i=0;i<10;i++) { printf("%d ", data[i]); } printf("\n"); printf("快速排序:"); quickSort(data, 0, 9); for(i=0;i<10;i++) { printf("%d ", data[i]); } printf("\n");
c语言数组排序小结
C语言数组排序小结 让我们先定义一个整型数组a[n],下面用五种方法对其从小到大排序。 (1)“冒泡法” 冒泡法大家都较熟悉。其原理为从a[0]开始,依次将其和后面的元素比较,若a[0]>a[i],则交换它们,一直比较到a[n]。同理对a[1],a[2],...a[n-1]处理,即完成排序。下面列出其代码: void bubble(int *a,int n) /*定义两个参数:数组首地址与数组大小*/ { int i,j,temp; for(i=0;ia[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } /*冒泡排序2: 将数组中的每相邻的两个数进行比较,“泡”在后面 */ void bubble2(int a[],int n) /*定义两个参数:数组首地址与数组大小*/ { int i,j,temp; for(i=1;ia[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } 冒泡法原理简单,但其缺点是交换次数多,效率低。 下面介绍一种源自冒泡法但更有效率的方法“选择法”。 (2)“选择法” 选择法循环过程与冒泡法一致,它还定义了记号k=i,然后依次把a[k]同后面元素比较,若a[k]>a[j],则使k=j.最后看看k=i是否还成立,不成立则交换a[k],a[i],这样就比冒泡法省下许多无用的交换,提高了效率。 void choise(int *a,int n)