用c++实现归并排序的问题

打算用递归法实现归并排序,但结果总是不对,找不到问题,求大佬解答
#include
using namespace std;
int a[100];
void merge(int m[],int l,int r,int rightend);
void sort(int m[],int l,int r);
void msort();
int n;
int main()
{
cin>>n;
for(int i=0;i {
cin>>a[i];
}
msort();
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
}
void sort(int m[],int l, int r)
{
int center;
if(l<r)
{
center=(l+r)/2;
sort(m,l,center);
sort(m,center+1,r);
merge(m,l,center+1,r);
}
}
void merge(int m[],int l,int r,int rightend)
{
int t=0;
int leftend=r-1;
while(l<=leftend&&r<=rightend)
{
if(a[l]<=a[r])
{
m[t++]=a[l++];
}
else
{
m[t++]=a[r++];
}
}
while(l<=leftend) m[t++]=a[l++];
while(r<=rightend) m[t++]=a[r++];
for(int i=0;i<t;i++)
{
a[l+i]=m[i];
}
}
void msort()
{
int temp[100];
sort(temp,0,n-1);
}

6个回答

找到两处问题
1.t应该从l开始
2.l中间已经修改了
修改后代码如下

 #include<stdio.h>
#include <iostream>
using namespace std;
int a[100]; 
void merge(int m[],int l,int r,int rightend);
void sort(int m[],int l,int r);
void msort();
int n;
int main()
{
  cin>>n;
  for(int i=0;i <n;++i)
  {
    cin>>a[i];
  }
  msort();
  for(int i=0;i<n;i++)
  {
    cout<<a[i]<<" ";
  }
}
void sort(int m[],int l, int r)
{
  int center;
  if(l<r)
  {
    center=(l+r)/2;
    sort(m,l,center);
    sort(m,center+1,r);
    merge(m,l,center+1,r);
  }
}
void merge(int m[],int l,int r,int rightend)
{
  //这里的t应该从该l开始而不是从0 开始
  int t=l;
  //这里要将l保存下来
  int start = l;
  int leftend=r-1;
  while(l<=leftend && r<=rightend)
  {
    if(a[l]<=a[r])
    {
      m[t++]=a[l++];
    }
    else
    {
      m[t++]=a[r++];
    }
  }
  while(l<=leftend) m[t++]=a[l++];
  while(r<=rightend) m[t++]=a[r++];

  //因为上面的l++,已经将l加到了leftend
  //这里应该从开始start 到 最后的 t 都应该修改
  for(int i=start;i<t;i++)
  {
    a[i]=m[i];
  }
}
void msort()
{
  int temp[100];
  sort(temp,0,n-1);
}

感觉程序是有问题,但不知道怎么描述。试试吧每一次迭代的结果打印出来,可能你也会明白的

看你代码,下面部分是想把合并好的数 重新写入数组a吧。

    for(int i=0;i<t;i++)
    {
        a[l+i]=m[i];
    }

问题应该是变量l在前面已经变掉了,这时的l实际上已经是center了

看你代码,下面部分是想把合并好的数 重新写入数组a吧。

m[t++]=a[l++];这里已经把 l 改变了

楼主可以用Visual Studio进行单步调试看看 那一步出了问题

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
MPI并行冒泡二路归并排序问题

我思路是想吧随机产生的数组a 按照总进程数分s份 然后分到别的进程冒泡排序,然后在聚集回来 二路归并下边是代码 求大神帮忙改改~~~ // mpi.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "mpi.h" #include <ctime> #include <stdio.h> #include <math.h> #include <iostream> #include <windows.h> using namespace std; void merge(int x[],int z[],int s,int u,int v) //2-路·归并排序 { int i,j,q; i=s; j=u+1; q=s; while(i<=u&&j<=v) { if(x[i]<=x[j]) z[q++]=x[i++]; else z[q++]=x[j++]; } while(i<=u) //将X中剩余元素X[i..u]复制到Z z[q++]=x[i++]; while(j<=v) //将X中剩余元素X[j..v]复制到Z z[q++]=x[j++]; } void bubble(int a[],int n) { int i,j,t; for(i=0;i<n-1;i++) for(j=0;j<n-1-i;j++) if(a[j]>a[j+1]) { t=a[j+1]; a[j+1]=a[j]; a[j]=t; } } void main(int argc, char* argv[]) { MPI_Comm comm=MPI_COMM_WORLD; int n,m,rank,size,i,r,s,step; int *a,*b,*c,*d,*e; a=(int *)malloc(n*sizeof(int)); e=(int *)malloc(n*sizeof(int)); double startwtime,endwtime; MPI_Status status; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&size); MPI_Comm_rank(MPI_COMM_WORLD,&rank); if(rank==0){ cout<<"输入数列上限:"; cin>>n; cout<<"输入整数范围:"; cin>>m; srand(unsigned(time(0))); cout<<"产生的随机数列:"; s=n/size;r=n%size; b=(int *)malloc(n+rank-r*sizeof(int)); for(i=0;i<n;i++) { a[i]=rand()%m; b[i]=a[i]; cout<<a[i]<<" "; } cout<<endl; if(r!=0) { for(i=n;i<n+rank-r;i++) { b[i]=0; } s=s+1; } startwtime=MPI_Wtime(); MPI_Scatter(a,s,MPI_INT,b,s,MPI_INT,0,comm); bubble(b,s); } else { c=(int *)malloc(s*sizeof(int)); MPI_Scatter(a,s,MPI_INT,c,s,MPI_INT,0,comm); bubble(c,s); } if(rank!=0) { d=(int *)malloc(n*sizeof(int)); MPI_Gather(d,s,MPI_INT,b,s,MPI_INT,0,comm); MPI_Gather(d,s,MPI_INT,c,s,MPI_INT,0,comm); merge(d,e,0,n/2-1,n-1); } if(rank==0){ cout<<"排序结果:"; for(i=0;i<n;i++) { cout<<e[i]<<" "; } cout<<endl; endwtime=MPI_Wtime(); cout<<"wall clock time="<<endwtime-startwtime<<endl; } MPI_Finalize(); }

求助一道C语言排序问题?

编写程序实现归并排序,归并排序的思想就是将两个或多个有序记录序列合并成一个新的有序序列。假设有序列{1,3,5,7,9},第二个序列是{2,4,6,8},请归并成一个由小到大排列的有序序列。

分治算法:二分归并排序的合并中一段代码有疑问

![图片说明](https://img-ask.csdn.net/upload/201903/20/1553018183_618620.png) 上图是数据 下图是合并代码 求大神帮帮忙!!! ![图片说明](https://img-ask.csdn.net/upload/201903/20/1553018246_640516.png)

数据结构C语言顺序表的排序和删除问题

顺序表定义的长度为10000,此时程序可以正常运行;把顺序表长度改成500000,程序出错,不能运行。求问大神是哪里出了错误,还是要提高存储上限?如何改正?#include <stdio.h> #include <stdlib.h> #include <time.h> typedef int ElemType; #define MAX 10000 typedef struct{ ElemType *elem; int length; }SqList; void InitList(SqList &L){ L.elem = (ElemType *)malloc(MAX*sizeof(ElemType)); free(L.elem); L.elem = (ElemType *)malloc(MAX*sizeof(ElemType)); L.length = MAX; }//初始化顺序表 void Merge(ElemType SR[],ElemType TR[],int i,int m ,int n){ int j,k; for(j=m+1,k=i;i<=m&&j<=n;k++){ if(SR[i]<=SR[j]) TR[k]=SR[i++]; else TR[k] = SR[j++]; } while(i<=m) TR[k++] = SR[i++]; while(j<=n) TR[k++] = SR[j++]; }// 将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n] void Msort( ElemType SR[], ElemType TR1[], int s, int t ){ int k; ElemType TR2[MAX]; if(s==t) TR1[s] = SR[s]; else { k = (s+t)/2; Msort(SR,TR2,s,k); Msort(SR,TR2,k+1,t); Merge(TR2,TR1,s,k,t); } }// 对SR[s..t]进行归并排序,排序后的记录存入TR1[s..t] void SelectSort(SqList &L){ int i,j,k; ElemType temp; int n=L.length; for(i=1;i<n;i++){ k = i; for(j=i+1;j<=n;j++) if(L.elem[j]<L.elem[k]) k=j; if(i!=k){ temp = L.elem[i]; L.elem[i] = L.elem[k]; L.elem[k] = temp; } } }//简单选择排序的实现 int QKPass(ElemType s[],int left,int right){ ElemType x = s[left]; while(left<right){ while(left<right && s[right]>=x){ right--; } if(left<right){ s[left] = s[right]; left++; } while(left<right && s[left]<=x){ left++; } if(left<right){ s[right] = s[left]; right--; } } s[left] = x; return left; }//一趟快速排序算法 void HeapAdjust (SqList &H, int s, int m){ H.elem[0] = H.elem[s]; int j; H.elem[0] = H.elem[s]; for(j = 2*s ; j<=m; j*=2){ if(j<m && H.elem[j]<H.elem[j+1]) j++; if(H.elem[0]>=H.elem[j]) break; H.elem[s] = H.elem[j]; s = j; } H.elem[s] = H.elem[0]; }//保存大顶堆的根元素后,对大顶堆的调整 void HeapSort (SqList &H){ int i ; ElemType temp; for(i=H.length/2;i>1;i--) HeapAdjust(H,i,H.length); temp = H.elem[0]; H.elem[0] = H.elem[H.length]; H.elem[H.length] = temp; for(i = H.length-1;i>1;i--){ HeapAdjust(H,1,i); temp = H.elem[1]; H.elem[1] = H.elem[i]; H.elem[i] = temp; } }//建立大顶堆,实现堆排序 void BubbleSort(SqList &L){ int n = L.length,change = 1; int i,j; ElemType temp; for(i=1;i<n && change;i++){ change = 0; for(j=1;j<=n-i;j++) if(L.elem[i]>L.elem[j]){ temp = L.elem[i]; L.elem[i] = L.elem[j]; L.elem[j] = temp; change = 1; } } }//冒泡排序算法实现 void QKsort(ElemType s[],int low,int high){ int pos; if(low<high){ pos = QKPass(s,low,high); QKsort(s,low,pos-1); QKsort(s,pos+1,high); } }//递归实现快序排序 void DeleteItem(SqList &L,ElemType item){ int i; for(i=1;i<L.length;i++) if(L.elem[i]==item){ L.elem[i] = L.elem[--L.length]; free(&L.elem[L.length]); } }//删除与item相同元素 int main(){ double t1,t2; int i; SqList L1,L2; int k; printf("**************************************\n"); printf("0、退出\n"); printf("1、二路归并排序\n"); printf("2、堆排序\n"); printf("3、冒泡排序\n"); printf("4、快速排序\n"); printf("5、直接插入排序\n"); printf("6、删除与Item相同元素\n"); printf("**************************************\n"); do{ InitList(L1); InitList(L2); scanf("%d",&k); for(i=1;i<L1.length;i++) L1.elem[i] = rand()%MAX; for(i=1;i<L2.length;i++) L2.elem[i]=i; switch(k){ case 0:break; case 1: printf("\n********二路归并排序******\n"); t1=clock(); Msort(L1.elem,L1.elem,1,L1.length-1); t1 = clock() - t1; t2=clock(); Msort(L2.elem,L2.elem,1,L2.length-1); t2 = clock()- t2; break; case 2: printf("\n**********堆排序*********\n"); t1=clock(); HeapSort(L1); t1 = clock() - t1; t2=clock(); HeapSort(L2); t2=clock() - t2; break; case 3: printf("\n*********冒泡排序********\n"); t1=clock(); BubbleSort(L1); t1 = clock() - t1; t2=clock(); BubbleSort(L2); t2=clock() - t2; break; case 4: printf("\n*********快速排序********\n"); t1=clock(); QKsort(L1.elem,1,L1.length-1); t1 = clock() - t1; t2=clock(); QKsort(L2.elem,1,L2.length-1); t2=clock() - t2; break; case 5: printf("\n********直接插入排序******\n"); t1=clock(); SelectSort(L1); t1 = clock() - t1; t2=clock(); SelectSort(L2); t2=clock() - t2; break; case 6: t1=clock(); DeleteItem(L1,5); t1=clock()-t1; for(i=1;i<L1.length;i++) printf("%d ",L1.elem[i]); break; default : printf("\n输入错误!\n\n"); } if(0<k&&k<6){ printf("\n该排序无序表排序时间:%f毫秒\n",(double)t1); printf("\n该排序有序表排序时间:%f毫秒\n\n",(double)t2); } else if(k==6) printf("\n删除元素的时间为%f毫秒\n",(double)t1); }while(k!=0); return 0; }

链表的二路归并 求大神发完整的代码!!不会写啊!

题目:设有n个待排序元素存放在一个不带表头结点的单链表中, 每个链表结点只存放一个元素, 头指针为r。试设计一个算法, 对其进行二路归并排序, 要求不移动结点中的元素, 只改各链结点中的指针, 排序后r仍指示结果链表的第一个结点。

光荣的梦想(逆序对&&归并排序)

光荣的梦想 **Prince对他在这片大陆上维护的秩序感到满意,于是决定启程离开艾泽拉斯。在他动身之前,Prince决定赋予King__Bette最强大的能量以守护世界、保卫这里的平衡与和谐。在那个时代,平衡是个梦想。因为有很多奇异的物种拥有各种不稳定的能量,平衡瞬间即被打破。KB决定求助于你,帮助他完成这个梦想。_ **一串数列即表示一个世界的状态。 **平衡是指这串数列以升序排列,而从一串无序数列到有序数列需要通过交换数列中的元素来实现。KB的能量只能交换相邻两个数字。他想知道他最少需要交换几次就能使数列有序。 输入格式 第一行为数列中数的个数 N(n≤100000)。 第二行为 N 个数 a1~an (每个数小于100000),表示当前数列的状态。 输出格式 输出一个整数,表示最少需要交换几次能达到平衡状态。 输入 4 2 1 4 3 输出 2 ``` #include<iostream> #include<cstring> #include<string> #include<cstdlib> #include<cstdio> #include<ctime> #include<cmath> #include<cctype> #include<algorithm> #include<iomanip> using namespace std; long long ans=0; int a[500005],r[500005],n; inline void zql(int s,int mid,int t) { int k=s; int i=s; int j=mid+1; while(i<=mid&&j<=t) if(a[i]>a[j]) { r[k++]=a[j++]; ans=ans+(mid+1-i); } else r[k++]=a[i++]; while(i<=mid) r[k++]=a[i++]; while(j<=t) r[k++]=a[j++]; for(i=s;i<=t;i++) a[i]=r[i]; } inline void gl(int s,int t) { if(s<t) { int mid=(s+t)/2; gl(s,mid); gl(mid+1,t); zql(s,mid,t); } } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; gl(1,n); cout<<ans<<endl; return 0; } ``` 其中的逆序对和归并排序基本思想和具体实现是什么?望大神详解。

C语言或C++实现,排序方法的时间比较?

利用随机函数产生10个样本,每个样本有20000个随机整数(并使第一个样本是正序,第二个样本是逆序)利用直接插入排序、希尔排序,冒泡排序、快速排序、选择排序、堆排序,归并排序、基数排序8种排序方法进行排序(结果为由小到大的顺序)并统计每一种排序算法对不同样本所耗费的时间。 基本要求(1) 原始数据存在文件中,用相同样本对不同算法进行测试; (2) 屏幕显示每种排序算法对不同样本所花的时间;

归并算法java实现的问题

package algorithm; public class MergeSort { // private static long sum = 0; /** *  * <pre> *  * 二路归并 *  * 原理:将两个有序表合并和一个有序表 *  * </pre> *  * *  * @param a *  * @param s *  * 第一个有序表的起始下标 *  * @param m *  * 第二个有序表的起始下标 *  * @param t *  * 第二个有序表的结束小标 *  * */ private static void merge(int[] a, int s, int m, int t) { int[] tmp = new int[t - s + 1]; int i = s, j = m, k = 0; while (i < m && j <= t) { if (a[i] <= a[j]) { tmp[k] = a[i]; k++; i++; } else { tmp[k] = a[j]; j++; k++; } } while (i < m) { tmp[k] = a[i]; i++; k++; } while (j <= t) { tmp[k] = a[j]; j++; k++; } System.arraycopy(tmp, 0, a, s, tmp.length); } /** *  * *  * @param a *  * @param s *  * @param len *  * 每次归并的有序集合的长度 */ public static void mergeSort(int[] a, int s, int len) { int size = a.length; int mid = size / (len << 1); int c = size & ((len << 1) - 1); // -------归并到只剩一个有序集合的时候结束算法-------// if (mid == 0) return; // ------进行一趟归并排序-------// for (int i = 0; i < mid; ++i) { s = i * 2 * len; merge(a, s, s + len, (len << 1) + s - 1); } // -------将剩下的数和倒数一个有序集合归并-------// if (c != 0) merge(a, size - c - 2 * len, size - c, size - 1); // -------递归执行下一趟归并排序------// mergeSort(a, 0, 2 * len); } public static void main(String[] args) { int[] a = new int[]{4, 3, 6, 1, 2, 5}; mergeSort(a, 0, 1); for (int i = 0; i < a.length; ++i) { System.out.print(a[i] + " "); } } } 就这个算法,其他还好理解,那个mergesort方法完全看不懂,,不知道c和mid代表什么,也不了解位移运算符和&运算符的用法,有大神能帮我看一下么,谢谢了

请问这样一道C语言排序问题怎么做?

假定有10个整型数的无序数据集,请用快速排序进行由小到大的排列,再有一个由5个整型数组成的无序序列,请用插入排序法进行排序,然后将这两个子序列进行归并排序,并用二分法查找指定的数据,如果找到,指出其位置,如果没找到,输出相应的提示。

使用合并排序算法,对输入的n个数据进行按升序排序。

使用合并排序算法,对输入的n个数据进行按升序排序。 输入描述 分两行,第一行是整数n,第二行是n个整数,每个整数之间用空格间隔。 输出描述 按升序排序的n个整数 输入样例 8 9 8 7 6 5 4 3 2 输出样例 2 3 4 5 6 7 8 9

关于冒泡排序计算比较次数和交换次数问题

实现如图,不知道为什么不管什么序的测试数组 swap的值phwgng始终是0 求指教QAQ![图片说明](https://img-ask.csdn.net/upload/201711/07/1510015171_37215.png)

快速排序 OpenMP并行程序

#include <stdio.h> #include <windows.h> #include <time.h> #include <omp.h> int numThread=2; void quicksort(int *A, int l, int u) { if(l >= u) { return; } int first = l; int last = u; int key = A[first]; //用字表的第一个记录作为枢轴 while(first < last) { while(first < last && A[last] >= key) { --last; } A[first] = A[last]; //将比第一个小的移到低端 while(first < last && A[first] <= key) { ++first; } A[last] = A[first]; //将比第一个大的移到高端 } A[first] = key; //枢轴记录到位 quicksort(A,l,first-1); quicksort(A,first+1,u); } void main(int argc, char *argv) { omp_set_num_threads(numThread); int j=50000,k=0,i=0; int m=0,n=0; double start,end,difftime1,difftime2; int len=50000; int len2=len/2; int B[50000],C[25000],D[25000]; #pragma omp parallel default(none) shared(B,len) private(i) { #pragma omp for for(i=0;i<len;i++) { B[i]=1+rand()%50000; //初始化B数组 } } //串行程序 start=clock(); //开始计时 quicksort(B,0,len-1); end=clock(); //结束计时 difftime1=(end-start)/1000; printf("%lf seconds\n",difftime1); //输出运行时间 //多线程程序 start=clock(); //开始计时 #pragma omp parallel default(none) shared(B,C,D,len2) private(i) { #pragma omp for for(i=0;i<len2;i++) //这个for循环是并行的 { C[i]=B[i]; //将B的前25000个数放入C D[i]=B[i+25000]; //将B的后25000个数放入D } } #pragma omp parallel default(none) shared(C,D,len2) //private(i)快速排序的并行 { #pragma omp parallel sections { #pragma omp section quicksort(C,0,len2-1); //对C排序 #pragma omp section quicksort(D,0,len2-1); //对D排序 } } for(;k<len;k++) //将C和D进行归并排序放入B里面 { if(m<len2&&n<len2) { if(C[n]<=D[m]) { B[k]=C[n]; n++; } else { B[k]=D[m]; m++; } } if(m==len2||n==len2) { if(m==len2) B[k]=D[m]; else B[k]=C[n-1]; k+=1; break; } } if(n<len2) { int tem=len2-n; for(int p=0;p<tem;p++) { B[k]=C[n]; n++; k++; } } else if(m<len2) { int tem=len2-m; for(int q=0;q<tem;q++) { B[k]=D[m]; m++; k++; } } end=clock(); //结束计时 difftime2=(end-start)/ 1000; printf("%lf seconds\n",difftime2); //输出运行时间 printf("speed ratio=%.3f\n",difftime1/difftime2); //加速比 system("pause"); } 总是运行不出来结果

关于c++几种简单排序算法的比较次数和移动次数的问题

排序结果没有问题,可是比较次数和移动次数的计数结果不对。求高人指点。 ``` #include<iostream> using namespace std; class Sort { private: int *r; int n; // the number of elements of array int MoveNum; int CompNum; public: void insert(); void bubble(); int getn(); void quick(int,int); void select(); void shell(); void ini(); int partion(int,int); void Qsort(int,int); ~ Sort(); }; Sort::~Sort() { delete []r; } void Sort::ini() { int m; cout<<"输入带排序数字的个数为 "; cin>> m; r=new int[m+1]; cout<<"输入待排序的"<<m<<"个数:"<<endl; for (int i=1;i<=m;i++) { cin>>r[i]; } n=m; } void Sort::insert() { MoveNum=0; CompNum=0; for(int i=2;i<=n;i++) if(r[i]<r[i-1]) { r[0]=r[i]; for(int j=i-1;r[j]>r[0];j--) { r[j+1]=r[j]; MoveNum++; } r[j+1]=r[0]; } CompNum=MoveNum; cout<<"插入排序后的结果是"; for( i=1;i<=n;i++) cout<<r[i]<<" "; cout<<endl <<"移动次数为"<<MoveNum<<endl <<"比较次数为"<<CompNum<<endl<<endl<<endl; } void Sort::shell() { MoveNum=0; CompNum=0; for(int d=n/2;d>=1;d=d/2) { for(int k=d+1;k<=n;k++) { CompNum++; if(r[k]<r[k-d]) { r[0]=r[k]; int j=k-d; for(;j>0&&r[0]<r[j];j=j-d) { r[j+d]=r[j]; MoveNum++; } r[j+d]=r[0]; } } } cout<<"希尔排序后的结果是"; for(int i=1;i<=n;i++) cout<<r[i]<<" "; cout<<endl <<"移动次数为"<<MoveNum<<endl <<"比较次数为"<<CompNum<<endl<<endl<<endl; } void Sort::bubble() { int count=0; MoveNum=0; CompNum=0; int pos=n; while(pos!=0) { int bound=pos; pos=0; for(int i=1;i<bound;i++) { CompNum++; if(r[i]>r[i+1]) { r[0]=r[i]; r[i]=r[i+1]; r[i+1]=r[0]; pos=i;count++; } } } MoveNum=count*3; cout<<"冒泡排序后的结果是"; for( int i=1;i<=n;i++) cout<<r[i]<<" "; cout<<endl<<"移动次数为"<<MoveNum<<endl <<"比较次数为"<<CompNum<<endl<<endl<<endl; } void Sort::quick(int i,int j) { if(i<j) { int loc=partion(i,j); quick(i,loc-1); quick(loc+1,j); } } void Sort::Qsort(int i,int j) { MoveNum=0; CompNum=0; quick(i,j); cout<<"快速排序后的结果是"; for( i=1;i<=n;i++) cout<<r[i]<<" "; cout<<endl <<"移动次数为"<<MoveNum<<endl <<"比较次数为"<<CompNum<<endl<<endl<<endl; } int Sort::partion(int first,int end) { int i=first; int j=end; int pivot=r[i]; while(i<j) { MoveNum++; while((i<j)&&r[j]>=pivot) { j--; CompNum++; } r[i]=r[j]; MoveNum++; while((i<j)&&r[i]<=pivot) { i++; CompNum++; } r[j]=r[i]; MoveNum++; } r[i]=pivot; return i; } void Sort::select() { int count=0; int MoveNum=0;int CompNum=0; for(int i=1;i<n;i++) { int index=i; for(int j=i+1;j<=n;j++) { if(r[j]<r[index]) index=j; CompNum++; } if(index!=i) { r[0]=r[i]; r[i]=r[index]; r[index]=r[0]; count++; } } MoveNum=count*3; cout<<"选择排序后的结果是"; for(i=1;i<=n;i++) cout<<r[i]<<" "; cout<<endl <<"移动次数为"<<MoveNum<<endl <<"比较次数为"<<CompNum<<endl<<endl<<endl; } int Sort::getn() { return n; } void main() { Sort sort; sort.ini(); sort.insert(); sort.bubble(); int j=sort.getn(); sort.Qsort(1,j); sort.select(); sort.shell(); } ```

【12,2,16,30,8,128,4,10,20,6,18】按照希尔排序

上面的数字请按照希尔排序,并且有每一步详细的过程,还有它这种算法好在哪里, 不还是要用直接插入排序吗。

C语言将两个递增有序单链表归并为一个降序的单链表,求大侠帮忙看看

#include <stdio.h> #include <stdlib.h> #define N 8 typedef struct list { char c; struct list *next; } SLIST; SLIST *creat(char *a) { SLIST *h,*p,*q; int i; h=p=(SLIST *)malloc(sizeof(SLIST)); for(i=0; i<N; i++) { q=(SLIST *)malloc(sizeof(SLIST)); q->c=a[i]; p->next=q; p=q; } p->next=0; return h; } void output(SLIST *h) { SLIST *p; p=h->next; if (p==NULL) printf("\nThe list is NULL!\n"); else { printf("\nHead"); while(p->c!=0) { printf("->%c",p->c); p=p->next; } printf("->End\n"); } } SLIST *sub(SLIST *a,SLIST *b) { SLIST *pa,*pb,*r; pa=a; pb=b; r=NULL; //r为新链表头 while(pa->c!=0&&pb->c!=0) { if(pa->c< pb->c) { a=a->next; pa->next=r; r=pa; pa=a; } else { b=b->next; pb->next=r; r=pb; pb=b; } } while(pa!=NULL)//如果是表1未完,它的剩余结点倒序插入。 { a=a->next; pa->next=r; r=pa; pa=a; } while(pb!=NULL) { b=b->next; pb->next=r; r=pb; pb=b; } r=r->next; return(r); } void main() { SLIST *head1,*head2,*head3; char a[N]="abcdefg"; char b[N]="ABCDEFG"; head1=creat(a); printf("\nThe first list before merging:\n"); output(head1); head2=creat(b); printf("\nThe second list before merging:\n"); output(head2); head3=sub(head1,head2); printf("\nThe list after merging:\n"); output(head3); } /* 1.程序运行结果为: The first list before merging: Head->a->b->c->d->e->f->g->End The second list before merging: Head->A->B->C->D->E->F->G->End The list after merging: Head->g->f->e->d->c->b->a->G->F->E->D->C->B->A->?>蚉ress any key to continue ====C语言将两个递增有序单链表归并为一个降序的单链表,求大侠帮忙看看 程序运行时最后报错,为什么呢? */

编程:假设一个班的成绩交给M个人去输入,每个人随机从班级中抽出若干名学生信息进行输入

假设一个班的成绩交给M个人去输入,每个人随机从班级中抽出若干名学生信息进行输入, 每个人输入完后放在M个文件中, 每个人输入的成绩都按学号排好序的 学生成绩信息文件1(1.txt),例如: 姓名 性别 学号 语文 数学 英语 张明明 男 01 67 78 82 张辉灿 男 03 68 82 56 陈东明 男 05 67 38 47 李成友 男 32 78 91 88 王露 女 34 56 45 77 …. .. .. .. … 学生成绩信息文件2(2.txt), 例如: 姓名 性别 学号 语文 数学 英语 李华明 男 02 88 90 68 李明国 男 04 50 45 87 陈果 女 31 57 68 82 张明东 男33 48 42 56 陈道亮 男35 47 58 77 …. .. .. .. … 一共M个文件 1) 现在编程实现将M个文件的成绩合并一个文件,并且仍按学号有序的(total.txt) 提示,可以用合并排序 2) 从原文件(不是合并后文件)中抽出三科成绩中有补考的学生(只要有一门不及格,整个学生的信息都要抽出),并保存在一个新文件中,新文件不需要按学号有序(bk.txt) 3) 对补考文件(bk.txt) 中的数据按学号排序,保存在一个新文件bksort.txt (至少采用两种排序方法实现)中,并按各科打印出补考学生名单 4) 对于新文件(total.txt),读入内存,输入一个学生学号后,能查找到此学生的信息并输出结果(至少采用两种查找方法实现) 5). 对于新文件(total.txt),读入内存,分男生和女生分别到存到两个文件中(boy.txt,girl.txt) 要求男生和女生分别按学号有序 6). 对于新文件(total.txt),读入内存,按总分排序,放入到(scoresort.txt)中 规定: 学生信息要求使用结构体,采用顺序表实现上述要求,上述6个功能的程序分开编写,最后能够合在一起运行。每个功能可以设立菜单。 采用多种方法且算法正确者,可适当加分。 (数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决,文件读写功能要写成通用函数, 上述6个功能直接调用)

排序方法比较 具体看下面要求

对各种排序方法(直接插入排序、希尔排序、起泡排序、快速排序、直接选择排序、堆排序和归并排序)的时间性能进行比较。 1)基本要求: (1) 设计并实现上述各种排序算法; (2) 产生正序和逆序的初始排列分别调用上述排序算法,并比较时间性能; (3) 产生随机的初始排列分别调用上述排序算法,并比较时间性能。

c语言 非递减有序集合合并 代码输出不正确

巳知线性表LA和线性表LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的元素仍按值非递减有序排列。 输入 三行,第一行A,B集合的个数n,m 第二行:集合A的数据; 第三行:集合B的数据。 输出 二行,第一行,集合C的个数k 第二行:集合C的数据。 #include<stdio.h> void main() { int i,j,n,m,h,k=0,a[100],b[100],c[100]; scanf("%d %d",&n,&m); for(i=1;i<=n;i++) { scanf("%d",&a[i]); } for(j=1;j<=m;j++) { scanf("%d",&b[j]); } while(i==n||j==m) { for(k=0;;k++) { if(a[i]>b[j]) { c[k]=a[i]; i++; } else if(a[i]<b[j]) { c[k]=b[j]; j++; } else { c[k]=a[i]; i++; j++; } } } while(i<=n) { c[k++]=a[i]; i++; } while(j<=m) { c[k++]=b[j]; j++; } printf("%d\n",k); for(h=0;h<=k;h++) { printf("%d ",c[h]); } printf("\n"); } 请问怎么修改??

怎么用c#编辑函数一元二次方程,abc从键盘输入,实现根据a,b,c的值,△的值判断根的情况,并计算根?

![图片说明](https://img-ask.csdn.net/upload/201905/05/1557048324_31584.png) 下面的代码一直报错,要怎么修改啊 class Program { static void Main(string[] args) { double a, b, c; Console.WriteLine("请输入a、b、c:"); a = Convert.ToDouble(Console.ReadLine()); b = Convert.ToDouble(Console.ReadLine()); c = Convert.ToDouble(Console.ReadLine()); double x1; double x2; Add(a, b, c, out x1, out x2); Console.WriteLine("x1={0},x2={1}", x1, x2); Console.ReadKey(); } static void Add(double a, double b, double c, out double x1, out double x2) { if (b * b - 4 * a * c >= 0) { x1 = (-b + Math.Sqrt(b * b - 4 * a * c)) / (2 * a); x2 = (-b - Math.Sqrt(b * b - 4 * a * c)) / (2 * a); } else if (b * b - 4 * a * c == 0) { x1 = (-b) / (2 * a); } else { Console.WriteLine("无解!"); } } }

求大侠帮忙:C语言程序设计---编程题(以下所有题目程序应是非递归的)

1. 编写一个函数insert(s1,s2,ch),实现在字符串s1中的指定字符ch位置处插入字符串s2. 2. 学校工会组织活动,要求有8名教师参加,这8名教师将分别从A学院3名教师、B学院5名教师、C学院6名教师中任意抽取,且其中必须有B学院的教师参加,请编程输出所有可能的方案 3. 已知在C盘根目录下存有文本文件“file1.txt”,编程统计文件“file1.txt”中每个字母字符和每个数字字符出现的频率,在屏幕上显示统计结果,并将统计结果写入磁盘文件“file2.txt”中 4. 输入一个字符串,内有数字和非数字字符,如:AS234fgh456d 17968x7654,将其中连续的数字作为一个整体,依次存放到一数组a中,例如234存入a[0],456存入a[1],…,编程统计其共有多少个整数,并输出这些数。要求: 1) 编写函数完成将字符串中连续的数字作为一个整体,依次存放到一数组a中 2) 在主函数中完成数据的输入与结果的输出 5. 按由大到小的顺序对一个含有N个整型数据的数组A[N]进行排序,利用如下改进的选择排序方法:第一次选出最大者存入A[1],第二次选出最小者存入A[N],第三次选出次大者存入A[2],第四次选出次小者存入A[N-1],如此大小交替地选择,直到排序完成。要求: 1) 编写函数sort完成排序 2) 在主函数中完成数据的输入与结果的输出 6. 已知用两个单链表分别存储的两个字符串,均按递增次序排列。编程实现将这两个单链表归并为一个按数据域值递减次序排列的单链表。要求: 1) 单链表中每个结点只存放一个字符 2) 利用原链表中的结点空间存储归并后的单链表,不另外生成新链表 3) 单链表的建立写一函数create实现 4) 两个链表归并过程写一函数sub实现 5) 输出结果写一函数output实现 6) 主函数调用这三个函数完成程序功能

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

点沙成金:英特尔芯片制造全过程揭密

“亚马逊丛林里的蝴蝶扇动几下翅膀就可能引起两周后美国德州的一次飓风……” 这句人人皆知的话最初用来描述非线性系统中微小参数的变化所引起的系统极大变化。 而在更长的时间尺度内,我们所生活的这个世界就是这样一个异常复杂的非线性系统…… 水泥、穹顶、透视——关于时间与技艺的蝴蝶效应 公元前3000年,古埃及人将尼罗河中挖出的泥浆与纳特龙盐湖中的矿物盐混合,再掺入煅烧石灰石制成的石灰,由此得来了人...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

外包程序员的幸福生活

今天给你们讲述一个外包程序员的幸福生活。男主是Z哥,不是在外包公司上班的那种,是一名自由职业者,接外包项目自己干。接下来讲的都是真人真事。 先给大家介绍一下男主,Z哥,老程序员,是我十多年前的老同事,技术大牛,当过CTO,也创过业。因为我俩都爱好喝酒、踢球,再加上住的距离不算远,所以一直也断断续续的联系着,我对Z哥的状况也有大概了解。 Z哥几年前创业失败,后来他开始干起了外包,利用自己的技术能...

C++11:一些微小的变化(新的数据类型、template表达式内的空格、nullptr、std::nullptr_t)

本文介绍一些C++的两个新特性,它们虽然微小,但对你的编程十分重要 一、Template表达式内的空格 C++11标准之前建议在“在两个template表达式的闭符之间放一个空格”的要求已经过时了 例如: vector&lt;list&lt;int&gt; &gt;; //C++11之前 vector&lt;list&lt;int&gt;&gt;; //C++11 二、nullptr ...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

深入剖析Springboot启动原理的底层源码,再也不怕面试官问了!

大家现在应该都对Springboot很熟悉,但是你对他的启动原理了解吗?

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

【阿里P6面经】二本,curd两年,疯狂复习,拿下阿里offer

二本的读者,在老东家不断学习,最后逆袭

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

微软为一人收购一公司?破解索尼程序、写黑客小说,看他彪悍的程序人生!...

作者 | 伍杏玲出品 | CSDN(ID:CSDNnews)格子衬衫、常掉发、双肩包、修电脑、加班多……这些似乎成了大众给程序员的固定标签。近几年流行的“跨界风”开始刷新人们对程序员的...

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

我说我懂多线程,面试官立马给我发了offer

不小心拿了几个offer,有点烦

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

立即提问
相关内容推荐