精华内容
下载资源
问答
  • c语言数组插入排序法
    千次阅读
    2021-11-11 12:42:13

    插入法相对较复杂,基本原理是抽出一个数据,在前面数据中寻找相应的位置插入,然后继续下一个数据,直到排序完成

    以9、6、15、4、2为例来进行插入法排序

    元素[0]元素[1]元素[2]元素[3]元素[4]
    初始值961542
    第1次9

    第2次

    69
    第3次6915
    第4次46915
    结果246915

    从表中可知,第一次排序将第一个元素放在首位,然后取出第二元素与其比较,如果小于第一个数则放在第一个数左边,反之则放在右边。以此类推,将元素逐个取出与前面的相比较,直到最后一个元素找到相应的位置放入

    下面通过代码实现

    #include<stdio.h>
    int main()
    {
    	int arr[10];                      /*定义一个10个元素的数组*/ 
    	int i,j,temp,pos;                 /*temp记录最小值,pos记录最小值位置*/
    	for(i=0;i<=9;i++)                 /*输入各个数字*/
    	{
    		scanf("%d",&arr[i]);
    	}
    	for(i=1;i<10;i++)                  /*从数组的第二个元素开始循环*/
    	{
    		temp=arr[i];                  /*设置插入值*/ 
    		pos=i-1;                      /*记录插入值前一个位置*/ 
    		while(pos>=0&&temp<arr[pos])  /*与前面数逐个比较寻找插入值的位置*/ 
    		{
    			arr[pos+1]=arr[pos];      /*插入数值*/ 
    			pos--;
    		}
    		arr[pos+1]=temp;
    	}
    	for(i=0;i<=9;i++)                  /*输出排序后的数组*/
    	{
    		printf("%d ",arr[i]);
    	}
    	return 0;
     } 

    插入法排序共需要进行n-1次取出元素并寻找位置插入,因此当序列较为有序时,插入排序有较快的运算速度

    更多相关内容
  • C语言——数组中的插入排序法

    千次阅读 2020-07-19 11:15:03
    C语言——插入排序法C语言中有很多排序的方法,这次我先介绍一下插入排序法

    C语言——数组中的插入排序法!

    C语言中有很多排序的方法,这次我先介绍一下插入排序法。
    首先我们要知道对一些数字进行排序一般都是用循环来实现,插入排序也不例外。
    插入排序有一个要求就是:我要插入的位置前面的数字都必须是升序才可以,如果前面只有一个数字,那么我们就不需要考虑是否为升序,所以我们循环开始的地方为第二个数字,也就是数组中下标为1的位置。既然有数字位置的改变,所以要定义一个新的变量去储存要变化的变量的值。我们就将第二个数字的值赋给新定义的key中,然后去进行循环插入,最后就能完成数组的排序。
    写的不太好请多包涵。
    注意:我这个代码是在Linux环境下运行的,在C-Free中运行会有乱码,将中文换掉即可。

    #include <stdio.h>
    int main(){
    	int len = 0;
    	printf("请输入数组长度:");
    	scanf("%d",&len);
    	int arr[len];
    	printf("请输入%d个数组元素:",len);
    	int i = 0;
    	for(i=0;i<len;i++){
    		scanf("%d",&arr[i]);	
    	}
    	for(i=1;i<len;i++){//把arr[i]元素插入到arr[0]-arr[i]区间 使这个区间有序
    		int key = arr[i];//记录arr[i] 
    		int j=0;
    		for(j=i-1;j>=0 && arr[j]>key;--j){
    			arr[j+1] = arr[j];	
    		}
    		if(j+1 != i){
    			arr[j+1] = key;
    		}
    	}
    	for(i=0;i<len;i++){
    		printf("%d ",arr[i]);	
    	}
    	printf("\n");
    	return 0;	
    }
    
    展开全文
  • C语言 数组部分知识、实现数组查找和排序

    数组的定义和初始化

       数组在定义是要注意:
      1.数组同变量一样,需要先定义后才能使用
      2.定义数组时,[ ]内不能用变量表示元素个数(在引用时可以,如for内初始化数组),也不能用实数表示元素个数

      一维数组初始化要注意,{ }只能在数组定义的同时使用。数组不初始化,里面的数据将会是随机数
      正确示范:

    	/*正确示范1*/
    	int a[5];
    	a[0]=0;
    	a[1]=1;
    	a[2]=2;
    	a[3]=3;
    	a[4]=4;
    
    	/*正确示范2*/
    	int a[5]={0, 1, 2, 3, 4};	/*也可以写成下面这样*/
    	int a[]={0, 1, 2, 3, 4};	/*只有在给数组全部元素赋初值时可以省略[ ]内的数组元素个数*/
    
    	/*正确示范3*/
    	int a[5]={};	/*数组a全部元素被初始化为0*/
    	int a[5]={0};	/*数组a全部元素被初始化为0*/
    

      错误示范:

    	/*错误示范1*/
    	int a[5]=[0, 1, 2, 3, 4];	/*赋初值应用{ }括起来*/
    	int a[5]={0, 1, 2, 3, 4};	/*应写成这样*/
    
    	/*错误示范2*/
    	int a[5];
    	a={0, 1, 2, 3, 4};	/*{ }只能在定义的同时使用*/
    
    	/*错误示范3*/
    	int a[5]=1;		/*赋初值应用{ }括起来*/
    	int a[5]={1};	/*应该写成这样,这样写只有a[0]值为1,a[1]-a[4]全为0*/
    

      
      

    查找

    1.顺序查找

      查找数组a有没有值为25的元素

    #include <stdio.h>
    main()
    {
    	int a[10]={1, 0, 24, 30, 5, 9, 30, 25, 55, 49};
    	int i, j;
    	for(i=0; i<10; i++)
    		if(a[i]==25)	/*注意不要写成=,否则就是赋值了*/
    			break;
    	if(i>9)
    		printf("没找到25");
    	else
    		printf("25的下标为%d", i);	
    
    	return 0;
    }
    

      
      

    2.二分查找

      二分查找又称对分查找、折半查找。要使用二分查找有一个前提:数组中的数据必须由大到小或者小到大的有序顺序排列。

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        /*值为25的元素下标为10,即第11个*/
        int array[]={0, 1, 3, 6, 9, 14, 18, 22, 23, 24, 25, 28, 30, 33, 38, 44, 50};
        int low=0,high=sizeof(array)/sizeof(array[0]);	/*high初始值为数组长度*/
        int mid=0;
        int target=25;
    
        while(low<=high)
        {
    		mid=(low+high)/2;
    		if(array[mid]<target)
    			low=mid+1;		/*为什么不是low=mid,因为上一行已经排除mid,进一步缩小范围,更容易找到目标*/
    		else if(array[mid]>target)
    			high=mid-1;
    		else
    			break;		/*在找到array[mid]==target或者low>high时退出循环*/
    	}
    	if(low>high)
    		printf("没找到25");
    	else
    		printf("找到了,下标是%d", mid);
    		
        return 0;
    }
    
    

      
      

    排序方法

    1.(简单)选择排序法

      找到元素最小值/最大值,把它放在数组头,接着找剩下元素里的最值,把它放在上次找到的最值后面,直到最后一个元素。
      方法一:始终保持a[i]是一个更小值,直到它为剩下元素里值最小

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    /*选择排序实例1*/
    /*选择排序,要求:小的在前大的在后*/
    int main()
    {
    	int a[100]={};
    	int i, j, t;
    	int n=sizeof(a)/sizeof(a[0]);	/*数组长度*/
    
    	/*设置随机数种子*/
    	srand(time(NULL));
    	/*数组a的元素为随机的三位数*/
    	for(i=0; i<n; i++)
    		a[i]=rand()%1000;
    
    	/*选择排序*/
    	for(i=0; i<n-1; i++)
    	{
    		for(j=i+1; j<n; j++)
    			if(a[j]<a[i])
    				t=a[i], a[i]=a[j], a[j]=t;
    	}
    
    	/*打印数组*/
    	for(i=0; i<n; i++)
    		printf("%d ", a[i]);
    
    	return 0;
    }
    

      
      方法二:找到最小值的下标,然后和a[i]交换,使最小值位于前头

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    /*选择排序实例2*/
    /*选择排序,要求:小的在前大的在后*/
    int main()
    {
    	int a[100]={};
    	int i, j, k, t;
    	int n=sizeof(a)/sizeof(a[0]);	/*数组长度*/
    
    	/*设置随机数种子*/
    	srand(time(NULL));
    	/*数组a的元素为随机的三位数*/
    	for(i=0; i<n; i++)
    		a[i]=rand()%1000;
    	
    	/*选择排序*/
    	for(i=0; i<n-1; i++)	/*i比j小1,所以i范围是0~n-1*/
    	{
    		k=i;	/*最小值下标*/
    		for(j=i+1; j<n; j++)
    			if(a[j]<a[k])	/*因为k是j的变化值,只有在第0次循环时才是a[i]和a[j]比*/
    				k=j;		/*后面碰到a[j]比a[i]小的值,a[i]就会被换掉,再后面就是a[j]和a[j]之间比了*/
    		t=a[i], a[i]=a[k], a[k]=t;
    	}
    
    	/*打印数组*/
    	for(i=0; i<n; i++)
    		printf("%d ", a[i]);
    
    	return 0;
    }
    
    

      
      

    2.冒泡排序法

      冒泡排序,顾名思义,元素会像水里的泡泡一样,从底部一直上升到顶部,即前后元素相比较,大值元素被安排到数组尾部,小值元素在交换的时候自然而然的会排在头部。

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    /*冒泡排序,要求:小的在前大的在后*/
    int main()
    {
    	int a[100]={};
    	int i, j, t;
    	int n=sizeof(a)/sizeof(a[0]);	/*数组长度*/
    
    	/*设置随机数种子*/
    	srand(time(NULL));
    	/*数组a的元素为随机的三位数*/
    	for(i=0; i<n; i++)
    		a[i]=rand()%1000;	
    	
    	/*冒泡排序*/
    	for(i=0; i<n-1; i++)		/*冒泡次数为n-1次*/
    		for(j=0; j<n-1-i; j++)	/*a[j]要和a[j+1]比较,所以范围是0~n-1,由于每冒泡一次,下一个元素的比较次数就会-1*/
    			if(a[j+1]<a[j])
    				t=a[j], a[j]=a[j+1], a[j+1]=t;
    	
    
    	/*打印数组*/
    	for(i=0; i<n; i++)
    		printf("%d ", a[i]);
    		
    	return 0;
    }
    
    

      
      

    3.(直接)插入排序法

      跟打扑克牌时差不多,把选中元素插入到有序序列合适的位置中。

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    /*插入排序,要求:小的在前大的在后*/
    int main()
    {
    	int a[100]={};
    	int i, j, k, data;
    	int n=sizeof(a)/sizeof(a[0]);	/*数组长度*/
    
    	/*设置随机数种子*/
    	srand(time(NULL));
    	/*数组a的元素为随机的三位数*/
    	for(i=0; i<n; i++)
    		a[i]=rand()%1000;	
    	
    	/*插入排序*/
    	for(i=1; i<n; i++)		/*只有一个元素的序列就是排列好的了,所以从第二个开始*/
    	{
    		data=a[i];
    		for(j=0; j<i; j++)	/*遍历序列,找到合适的下标k*/
    			if(a[j]>data)	/*因为序列有序,所以元素都是从小到大排放大*/
    				break;
    		k=j;
    		for(j=i; j>k; j--)	/*后续元素后退一个,方便插入元素*/
    			a[j]=a[j-1];
    		a[k]=data;
    	}
    	
    
    	/*打印数组*/
    	for(i=0; i<n; i++)
    		printf("%d ", a[i]);
    		
    	return 0;
    }
    
    

      
      

    二维数组的查找方法(《剑指offer》题目)

      关于二维数组的二分查找、暴力搜索查找、线性查找(剑指offer题目,右上角解法),可以查看这篇文章:C语言 二维数组的查找方法(←点击查看原文)

      
      

    指针和一维数组

      指针就是地址(一种只能存放地址的数据类型),关于指针可以看看我写的另一篇文章~指针详解、指针和一维数组、实例(←点击查看原文)

    展开全文
  • 利用C语言实现数组的排序(直接插入排序法

    万次阅读 多人点赞 2019-04-16 11:59:01
    直接插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。 #pragma once #include <stdio.h> int insort(int s[], int n) { int i,j; for(i=2;i<=...

    直接插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。

    #pragma once
    #include <stdio.h>
    int insort(int s[], int n)   
    {
    	int i,j;
    	for(i=2;i<=n;i++)  
    	{
    		s[0]=s[i];  
    		j=i-1;  
    		while(s[0]<s[j])
    		{
    			s[j+1]=s[j];   
    			j--;    
    		}
    		s[j+1]=s[0];   
    	}
    	return 0;
    }
    int main()
    {
    	int a[11],i;   
    	printf("请输入10个数据:\n");
    	for (i =1;i<=10;i++)
    		scanf("%d",&a[i]);    
    	printf("原始顺序:\n");
    
    	for(i=1;i<11;i++)
    		printf("%5d",a[i]);   
    
    	insort(a,10);   
    
    	printf("\n 插入数据排序后顺序:\n");
    	for(i=1;i<11;i++)
    		printf("%5d",a[i]);
    	printf("\n");
    
    	return 0;
    }
    

    在这里插入图片描述
    简单插入排序在最好情况下,需要比较n-1次,无需交换元素,时间复杂度为O(n);在最坏情况下,时间复杂度依然为O(n2)。但是在数组元素随机排列的情况下,插入排序还是要优于上面两种排序的。

    展开全文
  • C语言数组插入问题

    2022-01-03 18:37:33
    数组插入问题。生成一个 10 元素构成的一维数组,数组元素由用户随机输入。要求:先按照 升序排列并输出。再输入一个数,按照升序的规律将其插入并输出 本题思路在于:用冒泡对数组进行排序,然后找到合适的...
  • 选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序。从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最小的那个交换...
  • 目录 一.简介 二.数组选择法排序原理 三.数组选择法排序实战 四....零基础 C/C++ 学习路线推荐 : ...3.插入法排序 4.快速法排序 二.数组选择法排序原理 将要排序数组分成两部分,一部分是从大到小已经排好序的,一部分
  • 目录 一.简介 二.数组快速法排序原理 三.数组快速法排序实战 四....零基础 C/C++ 学习路线推荐 : ...一....经过前面的学习,我们已经学会了数组遍历,在开发中,我们经常回碰到对数组...快速排序法号称是目前最优秀的算法
  • 直接插入排序
  • C语言数组的五种排序

    2020-01-10 11:04:08
    插入排序 归并排序 冒泡排序 冒泡排序的基本思想:不断比较相邻的两个数,让较大的元素不断地往后移。经过一轮比较,就选出最大的数;经过第2轮比较,就选出次大的数,以此类推。对于具有N个元素的数组R[N],进行...
  • 数组插入排序,带有原理图,一看就懂
  • } } /*选择将原数组按升序排序*/ printf("输入一个要插入的数:"); scanf("%d",&x); /*输入插入的数*/ for(i=0;i;i++){ if(x break; } } for(j=9;j>i-1;j--){ a[j+1]=a[j]; } a[i]=x; for(i=0;i;i++){ printf("%d...
  • 在实际开发中,有很多场景...对数组元素进行排序的方法有很多种,比如冒泡排序、归并排序、选择排序、插入排序、快速排序等,其中最经典最需要掌握的是「冒泡排序」。以从小到大排序为例,冒泡排序的整体思想是这...
  • 数组插入法排序原理 三.数组插入法排序实战 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.简介 经过前面的学习,我们已经学会了数组遍历,在开发中,我们经常回碰到对数...
  • ~~~C语言版本~~~冒泡排序选择排序直接插入排序二分插入排序希尔排序快速排序堆排序#define EXCHANGE(num1, num2) { num1 = num1 ^ num2;\num2 = num1 ^ num2;\num1 = num1 ^ num2;}排序算法是否稳定:相同元素...
  • c语言数组选择排序

    2021-05-22 16:25:42
    2018-07-06求一个给一维数组排序C语言函数额,你要那一种排序,我写了几个简单的排序效率不高,O(n^2)1。 插入法#include#include#define MAX 32767int a[MAX];void swap(int &a,int &b){int t=a;a=b;b=t;...
  • C语言数组+冒泡排序

    万次阅读 多人点赞 2019-02-03 17:17:58
    C语言数组
  • 使用插入排序将下面的数字按照从小到大的顺序排列 步骤1:数组中已经排好的是{1},将9插入数组中 步骤2:数组中已经排好的是{2,9},将5插入数组中 步骤3:数组中已经排好的是{2,5,9},将4插入数组中 步骤4:...
  • c语言实现插入排序

    千次阅读 2022-04-06 19:53:08
    插入排序:也称直接插入排序。基本思路:每一步将一个数插入一个已经排好的序列中,并使之保持有序。直到插完所有的数为止。 //插入排序(从小到大) #include<stdio.h> #include<stdlib.h> int number...
  • 插入排序C语言实现

    2021-05-20 12:24:52
    插入排序插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。(每步将一个待排序的元素,按其排序码...
  • C语言实现四种数组排序方法

    万次阅读 多人点赞 2020-04-28 11:37:39
    插入法排序(升序) #include<stdio.h> void main() { int i,a[10],temp,pos; printf("为数组元素赋值:\n"); for(i=0;i<10;i++) { printf("a[%d]=",i); scanf("%d",&a[i]); } for(i=1;i<...
  • 一、冒泡排序原理解析:(以从小到大排序为例)在一排数字中,将第一个与第二个比较大小,如果后面的数比前面的小,则交换他们的位置。然后比较第二、第三个……直到比较第n-1个和第n个,此时,每一次比较都将较大的一...
  • 这一个原创C语言编写的数组大小排序法,包括插入法和冒泡法.通过学习它的思想,把握这两种基本的算法,达到举一反三的效果。
  • C语言插入排序算法

    千次阅读 2021-05-19 14:45:22
    直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列。选择排序对大小为N的无序数组R[N]...
  • C语言插入排序法

    2021-05-12 11:59:00
    C语言插入排序法 #include <stdio.h> void insertionSort(int *arr, int len) { int i, j, tmp; for (i = 1; i < len - 1; i++) { tmp = arr[i]; for (j = i - 1; j >= 0 && arr[j] >...
  • C语言数组排序算法详解——选择、冒泡、交换插入法、折半C语言代码实现以及相应注释。可以参考本人另一篇博客关于C语言数组排序算法详解。
  • C语言-插入排序 (数据结构)
  • C语言数组添加和删除元素的实现

    千次阅读 2021-05-19 10:43:10
    数组不擅长插入(添加)和删除元素。数组的优点在于它是连续的,所以查找数据速度很快。但这也是它的一个缺点。正因为它是连续的,所以当插入一个元素时,插入点后所有的元素全部都要向后移;而删除一个元素时,删除点...
  • c语言数组--插入排序

    千次阅读 2013-10-05 13:06:53
    * 构造一个长度为11的一组数组,使用插入排序法进行排序 */ #include #include static void InsertSort(int *shuzu); void main() { system("clear"); int i=0; int shuzu[11]; srand((unsigned int)time...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,996
精华内容 6,398
热门标签
关键字:

c语言数组插入排序法