浙江大学MOOCデータ構造-10-スワップでソート6ソート(0、i)(25ポイント)

解決策はMOOCで教えられたアイデアに基づいていますが、実装方法はまったく同じではありません。所有している場合、このアイデアを思い付くのは困難です。実際には、3種類のリングの数を数えることです。与えられた順序で。ブログを参照してください10-sort6 Swap(0、i)でソート(25ポイント)アイデアは非常に明確だと思います。
エラーレコード:
1.struct Elem { int Data; int IsSelected = 0; //ここで直接初期化できますeh };構造体を定義するときにメンバーを初期化できますが、これはまだ可能であることがわかりました。2.//次の2行のコードの順序を間違えることはできませんtemp = p [temp] .Data; p [temp] .IsSelected = 1; 3.PElem p = new Elem [N]; //そうではありませんここでメモリを適用するためにnewを使用するのは非常に良いC言語のmallocに似ていますが、より簡潔で理解しやすいです。動的配列を適用しました。各要素は構造Elemであり、配列の最初のアドレスはpです。 、mallocを次のように記述する必要がある場合:PElem p =(PElem)malloc(N * sizeof(struct Elem)); 4。メモリを解放することを忘れないでくださいdelete [] p; 5.if(EleNum> 1)SwapCnt + = EleNum + 1; //条件6の場合、これを判断するのを忘れました。これを体験してください。条件が満たされた場合、続行を使用すると、現在のサイクルが破棄され、次のサイクルが直接入力されます。









#include<iostream>
using namespace std;
typedef struct Elem *PElem;
struct Elem{
    
    
  	int Data;
  	int IsSelected = 0;//这里可以直接初始化诶
};
int CntEleInCircle(PElem p,int pos){
    
    
  	int ret = 1;
  	int temp = pos;
  	while(p[temp].Data != pos){
    
    
      	//下两行代码的顺序不能错
      	temp = p[temp].Data;
      	p[temp].IsSelected = 1;     	
        ret++;
    }
  	return ret;
}
int main(){
    
    
  	int N,i;
  	cin>>N;
  	PElem p = new Elem[N];//这里使用new申请内存不是很熟练
		int SwapCnt = 0,EleNum;
  	for(i=0;i<N;++i){
    
    
      	cin>>p[i].Data;
    }
  	EleNum = CntEleInCircle(p,0);
  	if(EleNum>1) SwapCnt = EleNum - 1;
  	for(i=1;i<N;++i){
    
    
      	if(p[i].IsSelected) continue;
        EleNum = CntEleInCircle(p,i);
      	if(EleNum>1) SwapCnt += EleNum+1;//忘记判断这个if条件了
    }
  	cout<<SwapCnt;
  	delete[] p;//忘记释放了
  	return 0;
  	
}

おすすめ

転載: blog.csdn.net/weixin_43919570/article/details/105909989