呀嘿嘿 2021-03-06 21:55 采纳率: 50%
浏览 27

那位大佬帮我看看我的折半排序,算法哪里出问题了,怎末输出的结构不是由大到小排序输出的哪(在校大学生)

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20
typedef struct {
    int length;
    int *data;
}SqSort;

void InitSort(SqSort &L);   //初始化 
void CreateSort(SqSort &L,int n);     //排序的建立
void BinsertSort(SqSort &L);    //折半插入排序 
void DisplaySort(SqSort L);   //将排序过后的元素进行输出 

void InitSort(SqSort &L)
{
    L.data=(int *)malloc(sizeof(int)*MAXSIZE);  //为L.data指针所指向的位置分配MAXSIZE的空间 
    if(L.data==NULL)
    {
        printf("No enough memory to allocate!!!\n");
    }
    L.length=0;
}

void CreateSort(SqSort &L,int n)
{
    int i;
    printf("请输入%d个整数:\n",n);
    for(i=1;i<=n;i++)   //0号元素作为哨兵 
    {
        scanf("%d",&L.data[i]);
        L.length++;
    }    
  }  


void DisplaySort(SqSort L)
{
    int i;
    for(i=1;i<=L.length;i++)
    {
        printf("%d ",L.data[i]);
    }
}

void BinsertSort(SqSort &L)
{
    int i,j,low,mid,high;
    for(i=2;i<=L.length;++i)
    {
        L.data[0]=L.data[i];    //将当前元素存入哨兵 
        low=1,high=i-1; 
        while(low<=high)
        {
            mid=(low+high)/2; 
            if(L.data[0]<mid)
            {
                high=mid-1;
            }
            else
            {
                low=mid+1;
            }
        }   //此时循环结束,i要插入的位置是high+1,指向的元素位置
        for(j=i-1;j>=high+1;--j)
        {
            L.data[j+1]=L.data[j];   //元素后移 
         } 
         L.data[high+1]=L.data[0];
    }
 } 


int main()
{
    SqSort L;
    int n,i;
    InitSort(L);
    printf("How many number you want to input:\n");
    scanf("%d",&n);
    CreateSort(L,n);
    printf("此数组的长度为:%d",L.length);
    BinsertSort(L);
    printf("Plese output you alread sort numbers\n");
    DisplaySort(L);
    free(L.data);
 } 

  • 写回答

1条回答 默认 最新

  • qxdll 2021-03-07 08:13
    关注

    应该是  if 内low和high错了 

    void Binsert_sort(int *num, int n)
    {
    	int i = 0,j = 0;
    	int high,low,mid,key;
    	for(i=1; i<=n; i++) 
    	{
    		output_num(num,N);
    	    key = num[i];
    	    high = i-1;
    	    low = 0;
    	    while(low <= high)
    	    {
    	    	mid = (high+low)/2;
    	    	if(key > num[mid])
    	    	{
    	    		low = mid + 1;
    			}else
    			{
    				high = mid - 1;
    			}
    		}
    		for(j = i-1;j >= high+1;j--)
    		{
    			num[j+1] = num[j];
    		}
    		num[high+1] = key;
    		
        }
    }
    评论

报告相同问题?

悬赏问题

  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真