首页 > 其他分享 >折半排序

折半排序

时间:2023-07-25 10:45:58浏览次数:32  
标签:折半 int high 插入 low 排序 define

本文章的代码使用jetbrains公司旗下的的Clion编写,操作系统位macOS Ventura(13.2.1). 代码没有在dev-c++测试过(dev-c++可能会有相关的空格问题)

//
// Created by 魏志杰 on 2023/7/25.
//

#include "stdio.h"
#define Max 100
#define before  printf("排序前")
#define after   printf("排序后")
#define newline printf("\n")
#define print   printf("%6d", R[i].key)
#define printA  printf("%6d",A[i])
#define Array int A[]={5,7,2,5,9,6,42,1,67,2,3};

typedef struct {
    int key;
    int data;
}SqType;


// 直接插入排序是将无序区的R[i]的(1-n-1)通过从后向前顺序比较插入到有效区R(0,i-1)中,实际上,利用有序区的有序性,我们可以
//  可以采取折半查找的方法,先在R[0,i-1]中找到插入位置,在进行移动元素进行插入,这样的插入排序称为折半插入
//书上的
void binInsert(SqType R[],int n){      //对R[0,n-1]开始按递增有序进行折半插入
    int i,j ,low,high,mid;
    SqType tmp;
    for (i = 1; i < n; i++) {
        if (R[i-1].key>R[i].key){
            tmp=R[i];                     //将R[i]保存在tmp中
            low=0;high=i-1;
            while (low<=high){           //在R[low high]中折半查找有序插入的位置
                mid=(low + high) / 2;    //寻找中间的位置
                if (tmp.key < R[mid].key)
                    high=mid-1;           //插入点在左半区
                else
                    low = mid +1;         //插入点在右半区
                }
            for (j=i-1;j>=high+1;j--)     //元素后移
                R[j+1]=R[j];
                R[high+1]=tmp;            //插入原来的R[j]
            }
     }

}

//将序列分成已排序区和未排序区。初始时已排序区只包含第一个元素,剩余元素构成未排序区。

//从未排序区选择第一个元素,利用二分查找在已排序区找到合适的位置插入该元素,并将已排序区中的元素向后移动。

//重复步骤2,直到未排序区中的所有元素都插入到已排序区.

// 自己写的折半插入排序
void binaryInsertSort(int A[], int n) {
    int i, j, low, high, mid,temp;

    for (i = 1; i < n; i++) {
        temp = A[i];
        low = 0;
        high = i - 1;

        // 二分查找找到插入位置
        while (low <= high) {
            mid = (low + high) / 2;
            if (A[mid] > temp) {
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }

        // 将已排序区中的元素向后移动
        for (j = i - 1; j >= low; j--) {
            A[j + 1] = A[j];
        }

        // 插入元素到合适位置
        A[low] = temp;
    }
}



int  main(){
    SqType R[Max];
    Array;
    for (int i = 0; i < 10; i++)
        R[i].key = A[i];
    before;
    for (int i = 0; i < 10; i++)
        print;
    newline;
    binInsert(R,10);
    after;
    for (int i = 0; i < 10; i++)
        print;
    newline;
    binaryInsertSort(A,10);
    after;
    for (int i = 0; i < 10; i++)
        printA;

}

测试如下

标签:折半,int,high,插入,low,排序,define
From: https://www.cnblogs.com/xiaozhounandu/p/17579147.html

相关文章

  • 直接插入排序
    本文章的代码使用jetbrains公司旗下的的Clion编写,操作系统位macOSVentura(13.2.1).代码没有在dev-c++测试过(dev-c++可能会有相关的空格问题)#defineMax100#definebeforeprintf("排序前")#defineafterprintf("排序后")#definenewlineprintf("\n")#defineprint......
  • 用Java集合中的Collections.sort方法对list排序的两种方法
    用Collections.sort方法对list排序有两种方法第一种是list中的对象实现Comparable接口,如下:   <strong>/**02 *根据order对User排序03 */04 publicclassUserimplementsComparable{05 privateStringname;06 privateIntegerorder;07 publicStringgetN......
  • openpyxl-数据排序,过滤器
    过滤器,数据排序fromopenpyxlimportWorkbookwb=Workbook()sheet=wb.activedata=[['Item','Colour'],['pen','brown'],['book','black'],['plate','white'],[�......
  • [c/c++][考研复习笔记]排序篇学习笔记
    考研排序复习笔记插入排序#include<stdio.h>#include<stdlib.h>#defineMaxSize9//折半插入排序voidZBInsertSort(intA[],intn){ inti,j,high,low,mid; for(i=2;i<=n;i++){ A[0]=A[i]; low=1;high=i-1; while(low<=high){ mid=(low+high)/2......
  • echarts记录篇(一):使用柱状图实现排名前边有排序数字
    一、效果如图: 二、直接上代码yAxis:{inverse:true,//如果数据数组倒置排序,加上此代码data:categories1,offset:0,axisLabel:{fontSize:18,color:"#5DB3DC",margin:130,//距离右侧图形距离,配合axisLabel.l......
  • java 排序重载
    Java排序重载在Java中,排序是一种常见的操作,用于对数据进行按特定规则重新排列的过程。Java中提供了多种排序方法,包括对基本数据类型和对象类型进行排序。通过排序,可以提高数据的查找和比较效率。Java中的排序可以通过重载方法来实现,即在同一个类中定义多个具有相同名称但参数列表......
  • 【易语言】自定义数据类型排序
    .版本2.子程序自定义类型数组排序.参数排序组,特殊成员,参考数组.局部变量交换,逻辑型.局部变量未比数据,整数型.局部变量交换变量,特殊成员.局部变量N,整数型交换=真未比数据=取数组成员数(排序组).判断循环首(交换=真)交换=假.变量循......
  • 【优先队列】【堆排序实现优先队列】[1054. 距离相等的条形码](https://leetcode.cn/p
    【优先队列】【堆排序实现优先队列】1054.距离相等的条形码在一个仓库里,有一排条形码,其中第i个条形码为barcodes[i]。请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。你可以返回任何满足该要求的答案,此题保证存在答案。示例1:输入:barcodes=[1,1,1,2,2,2]......
  • c语言_十大排序算法
    1.冒泡排序思想:通过比较相邻的元素并交换它们来排序。时间复杂度为O(n^2); #include<stdio.h>voidbubble_sort(intarr[],intlen){inti,j,temp;for(i=0;i<len-1;i++)for(j=0;j<len-1-i;j++)if(arr[j]>arr[j+......
  • java list 随机排序
    java list随机排序 packagecom.vfsd.test;importjava.util.ArrayList;importjava.util.Collection;importjava.util.Collections;importjava.util.List;importjava.util.stream.Collectors;publicclassTest_List_Shuffle{publicstaticvoidma......