`
zjjzmw1
  • 浏览: 1366562 次
  • 性别: Icon_minigender_1
  • 来自: 开封
社区版块
存档分类
最新评论

二分法查找,排序

c 
阅读更多

首先申明,二分法查找只适用与已排序的数列,如果是混乱数列。。我也无能为力~

有一个数组 v 已经按升序排列了,数组 v 有 n=20 个元素。数组中有个元素 x,如何知道 x 位于该数组的第几位呢?

解决这个问题的一个普遍方法是二分法查找。下面是程序:

#include <stdio.h>
int binsearch(int x, int v[], int n);
main()
{
    int i, result, n;
	int wait;
    
    int x = 17;	// 需要查找的数值
	int v[19]; // 定义一个数组
	// 给数组赋值
	for(i = 0; i < 20; ++i)
    	v[i] = i;
	/**
	for(i = 0; i < 20; ++i)
		printf("%d \n", v[i]);
	*/
	n = 20;
	result = binsearch(x, v, n);
	printf("%d", result);
	scanf("%d", &wait);
}
int binsearch(int x, int v[], int n)
{
	int low, high, mid;
	low = 0;
	high = n - 1;
	while (low <= high)
	{
		mid = (low + high) / 2;
		if(x < v[mid])
			high = mid - 1;
		else if (x > v[mid])
			low = mid + 1;
		else
			return mid;
		// 看看循环执行了多少次
		printf("mid = %d, low = %d, high = %d \n", mid, low, high);
	}
	return -1;
}

思路很简单:首先将输入值 x 与数组 v 的中间元素比较,如果 x 小于中间的元素,则将 high 值设为 中间元素-1,同理,若 x 大于中间元素,则将中间元素 + 1作为 low,再在low 与 high之间进行查找

 

二分法插入排序 

算法思想简单描述:
在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们
中间的那个元素比,如果小,则对前半再进行折半,否则对后半
进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间
的所有元素后移,再把第i个元素放在目标位置上。

二分法没有排序,只有查找。所以当找到要插入的位置时。移动必须从最后一个记录开始,向后移动一位,再移动倒数第2位,直到要插入的位置的记录移后一位。

二分插入排序是稳定的,平均时间O(n2)

     void binsort(ref int[] data1)

1、二分法查找插入位置
  如果R[i]<R[m]成立,那右指针就要向左移动中间指针一位,否则,左指针要向左移动中间指针一位。反复查找,直到左指针大于右指针时停止。
2
、后移,有点迷惑,什么时候需要后移呢?有哪些记录需要移动呢?
  虽然我们很清楚的知道,我们需要后移那些排序码大于R[i]的记录,但难免会问自己这样几个问题。其实它相当于需要移动从i-1到左指针的记录。
3
、插入
  由1中得到的左指针其实就是元素要插入的位置。

4、算法

        {

           int left,right,num;

            int middle,j;

            forint i = 1;i < data1.Length;i++)

            {

                // 准备

                left = 0;

                right = i-1;

                num = data1[i];

                

                // 二分法查找插入位置

                while( right >= left)

                {

                    // 指向已排序好的中间位置

                    middle = ( left + right ) / 2;

                    if( num < data1[middle] )

                    // 插入的元素在右区间

                        right = middle-1; 

                    else

                    // 插入的元素在左区间

                        left = middle+1;    

                }

                // 后移排序码大于R[i]的记录

                for( j = i-1;j >= left;j-- )

                {

                    data1[j+1] = data1[j];

                }

                // 插入

                data1[left] = num;

            }

 

 

 

                    // 插入的元素在左区间

                        left = middle+1;    

                }

 

                // 后移排序码大于R[i]的记录

                for( j = i-1;j >= left;j-- )

                {

                    data1[j+1] = data1[j];

                }

                // 插入

                data1[left] = num;

            }

 


/* 二分法插入排序的算法源程序*/

#include<stdio.h>

#define MAXNUM 100
typedef int KeyType;
typedef int DataType;

typedef struct {
     KeyType key;        /* 排序码字段 */
     /*DataType info;    记录的其它字段 */
} RecordNode;

typedef struct {
     int n;                /* n为文件中的记录个数,n<MAXNUM */
     RecordNode record[MAXNUM];
} SortObject;

void binSort(SortObject * pvector) {       /* 按递增序进行二分法插入排序 */
     int i, j, left, mid, right;
     RecordNode temp;
     RecordNode *data = pvector->record;
    
     for( i = 1; i < pvector->n; i++ ) {
         temp = data[i];
         left = 0;   right = i-1;            /* 置已排序区间的下、上界初值 */
         while (left <= right) {
             mid = (left + right)/2;        /* mid指向已排序区间的中间位置 */
             if (temp.key < data[mid].key)
                 right = mid-1;             /* 插入元素应在左子区间 */
             else left = mid+1;             /* 插入元素应在右子区间 */
         }
         for (j = i-1;   j >= left;   j--)
             data[j+1] = data[j];           /* 将排序码大于ki的记录后移 */
         if (left != i) data[left] = temp;
     }
}

SortObject vector={10, 49,38,65,97,76,13,27,49,50,101};

int main(){
     int i;
     binSort(&vector);
     for(i = 0; i < vector.n; i++)
         printf("%d ", vector.record[i]);
     getchar();
     return 0;
}

 

 

 

分享到:
评论

相关推荐

    用python编写的二分法查找排序

    二分法查找(也称为二分查找、折半查找)是一种在有序数组中查找某一特定元素的搜索算法。但是,二分法查找并不涉及排序,它假设输入数组已经是有序的。

    c++ 二分法查找 二分法排序 混合排序 希尔排序 插入排序

    binary sort,二分法查找,binary search, 二分法排序,merge sort 混合排序,shell sort 希尔排序,insertion sort 插入排序。数据结构 data structure

    数据结构快速排序二分法查找

    二分法查找(Binary Search)是一种查找算法,用于查找排序后的数组中是否包含某个元素。二分法查找的时间复杂度为O(log n),是当前最快的查找算法之一。 在上面的代码中,BinSearch函数是二分法查找的实现,函数的...

    二分法排序和查找(C#)

    在C#中,二分法排序和查找的性能分析如下: - 二分查找的时间复杂度为O(log n),空间复杂度为O(1)。这是因为每次迭代都将搜索范围减半,所以查找效率非常高。 - 二分插入排序的平均和最坏情况时间复杂度为O(n^2),...

    C语言实现的二分法快速查找|二分法排序|二分法查找C#

    根据给定的文件信息,我们可以深入探讨二分查找算法在C语言中的实现,以及其在C#中的应用可能性。二分查找(Binary Search),又称折半查找,是一种在有序数组中查找特定元素的搜索算法。搜索过程从数组的中间元素...

    二分法排序算法 C语言实现

    二分法搜索算法是一种高效的查找算法,尤其适用于大数据量且数据已排序的情况。在C语言中实现二分查找,需要注意正确处理数组的创建、初始化以及查找过程中的边界条件。本例通过具体的代码实现了这一算法,可供学习...

    c语言 二分法查找

    ### C语言中的二分法查找 #### 知识点概览 1. **二分法查找的基本原理** 2. **二分法查找的适用场景** 3. **算法实现细节** 4. **时间复杂度分析** 5. **空间复杂度分析** 6. **代码示例与分析** 7. **常见问题及...

    java 冒泡算法和插入法排序,二分法查找

    本文将深入探讨Java中的冒泡排序、插入排序以及二分法查找这三种基础算法,这些都是面试时经常会被问到的技术点。 首先,让我们从冒泡排序开始。冒泡排序是一种简单直观的排序算法,它重复地遍历待排序的数列,一次...

    冒泡排序、快速排序和二分法查找的分析 Java

    ### 冒泡排序、快速排序和二分法查找的分析:Java实现 #### 冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列...

    二分法查找算法代码 c语言实现

    此外,二分法查找的前提是数据已经排序,如果数据未排序,我们通常需要先进行排序操作,这会增加额外的时间成本。 在实际应用中,二分法查找常用于大型数据库和搜索引擎的索引构建,因为它能快速定位数据,提高查询...

    二分法直接插入排序算法

    而“二分法直接插入排序”则是对传统直接插入排序的一种优化,它利用了二分查找的特性来减少在排序过程中查找插入位置的时间复杂度。 直接插入排序的基本步骤如下: 1. 假设数组中的第一个元素已经排序,从第二个...

    二分法查找源码

    二分法查找和顺序查找 排序后二分法

    易语言有序二分法查找

    **易语言有序二分法查找**是一种在已排序的数据序列中快速查找特定元素的高效算法。易语言,作为中国本土的编程语言,以其简洁的语句和易学性深受初学者喜爱。在这个主题中,我们将深入探讨有序二分法查找的原理、...

    Java常用排序算法&程序员必须掌握的8大排序算法+二分法查找

    本资料包聚焦于"Java常用排序算法"和"程序员必须掌握的8大排序算法",并深入探讨了"二分法查找"这一高效搜索技术。 首先,我们来看八大排序算法。这些算法包括: 1. **冒泡排序**:最简单的排序方法,通过不断交换...

    Java常用高效8大排序算法与二分法查找

    本文将深入探讨Java中常用的八大排序算法以及二分法查找,旨在帮助算法爱好者和开发人员提升解决问题的能力。 首先,让我们来看Java中的八大排序算法: 1. 冒泡排序:这是一种简单的排序方法,通过重复遍历待排序...

    二分法查找在PLC编程中的应用.pdf

    二分法查找是一种高效的查找算法,在有序数组中尤其适用。其基本思想是从已排序数组的中间元素开始查找,如果目标值与中间元素相等,则查找成功;如果目标值小于中间元素,则在数组的左半部分继续查找;如果目标值...

    Java二分法查找数组元素.zip

    但是,二分法查找要求数组必须是有序的,如果数组无序,则需要先进行排序操作。 总之,二分法查找是一种常用的查找算法,适用于有序数组中查找某个元素的位置。通过将待查找区间缩小一半的方式,可以快速地定位目标...

    数据结构之二分法查找和散列查找实验

    二分法查找的时间复杂度为O(log n),效率很高,但前提是数据必须事先排序。在C语言中实现二分法查找,你需要定义一个函数,该函数接受一个有序数组、目标值以及数组的起始和结束索引作为参数,并返回目标值在数组中...

    二分法查找

    二分法查找,又称折半查找,是一种在有序数组中搜索特定元素的高效算法。它利用了数组的线性特性,每次将待搜索区域减半,直到找到目标元素或者确定不存在为止。这种方法大大减少了查找所需的平均时间复杂度,是...

    C# 简单的冒泡、快速排序及二分法查找.zip

    本资源“C# 简单的冒泡、快速排序及二分法查找.zip”显然关注的是数据排序和查找算法的实现,这些都是计算机科学和编程的基础知识。 首先,我们来探讨冒泡排序(Bubble Sort)。这是一种简单的交换排序方法,适用于...

Global site tag (gtag.js) - Google Analytics