⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sortdlg.cpp

📁 用Visual C++实现排序算法大全
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					strNum.Format("%d",sortObject[objectName[j]].iNumber);	
				}
				dc.TextOut(objectCoord[sortObject[objectName[j]].iSeq].x-15,
					objectCoord[sortObject[objectName[j]].iSeq].y-30,
					strNum);
				
				TRACE("\n");			
				for(int w=0;w<SORT_OBJECT_NUM;w++)
				{
					TRACE("%d ",sortObject[objectName[w]].iNumber);
				}
				//延迟1S进行下一轮排序以便于动画显示
				Sleep(1000);				
			} 
		} 
	} 	
}

void CSortDlg::OnExchangeSort() 
{
	CClientDC dc (this) ;
	dc.SetBkColor(RGB(100,100,255));
	dc.FillRect(&CRect(0,0,250,150),&CBrush(RGB(100,100,255)));
	int objectName[SORT_OBJECT_NUM]; //每个位置对应的待排序对象名
	//初始化每个位置对应的待排序对象名
	for(int i=0;i<SORT_OBJECT_NUM;i++)
	{
		objectName[i] = i;
	}
	TRACE("\n");			
	for(int w=0;w<SORT_OBJECT_NUM;w++)
	{
		TRACE("%d ",sortObject[objectName[w]].iNumber);
	}
	//交换排序
	for(i=0;i<SORT_OBJECT_NUM;i++) 
	{ 
		for(int j=i+1;j<SORT_OBJECT_NUM;j++) 
		{ 
			
			if(sortObject[objectName[j]].iNumber < sortObject[objectName[i]].iNumber) 
			{ 				
				//交换序号
				int iTemp;
				iTemp = sortObject[objectName[j]].iSeq; 
				sortObject[objectName[j]].iSeq = sortObject[objectName[i]].iSeq; 
				sortObject[objectName[i]].iSeq = iTemp; 
				//交换对象名
				iTemp = objectName[j];
				objectName[j] = objectName[i];
                objectName[i] = iTemp;
                //显示变化
				CString strName;
				CString strNum;				
				//显示j位置的对象
				strName.Format("%d",sortObject[objectName[j]].iName);		
				dc.TextOut(objectCoord[sortObject[objectName[j]].iSeq].x-5,
					objectCoord[sortObject[objectName[j]].iSeq].y-8,
					strName);
				if(sortObject[objectName[j]].iNumber<1000)
				{				
					strNum.Format("  %d",sortObject[objectName[j]].iNumber);
				}
				else
				{
					strNum.Format("%d",sortObject[objectName[j]].iNumber);
				}
				dc.TextOut(objectCoord[sortObject[objectName[j]].iSeq].x-15,
					objectCoord[sortObject[objectName[j]].iSeq].y-30,
					strNum);
				//显示i位置的对象
				strName.Format("%d",sortObject[objectName[i]].iName);		
				dc.TextOut(objectCoord[sortObject[objectName[i]].iSeq].x-5,
					objectCoord[sortObject[objectName[i]].iSeq].y-8,
					strName);
				if(sortObject[objectName[i]].iNumber<1000)
				{
					strNum.Format("  %d",sortObject[objectName[i]].iNumber);		
				}
				else
				{
					strNum.Format("%d",sortObject[objectName[i]].iNumber);	
				}
				dc.TextOut(objectCoord[sortObject[objectName[i]].iSeq].x-15,
					objectCoord[sortObject[objectName[i]].iSeq].y-30,
					strNum);
				
				TRACE("\n");			
				for(int w=0;w<SORT_OBJECT_NUM;w++)
				{
					TRACE("%d ",sortObject[objectName[w]].iNumber);
				}
				//延迟1S进行下一轮排序以便于动画显示
				Sleep(1000);				
			} 
		} 
	} 	
}

void CSortDlg::OnSelectionSort() 
{
	CClientDC dc (this) ;
	dc.SetBkColor(RGB(100,100,255));
	dc.FillRect(&CRect(0,0,250,150),&CBrush(RGB(100,100,255)));
	int objectName[SORT_OBJECT_NUM]; //每个位置对应的待排序对象名
	//初始化每个位置对应的待排序对象名
	for(int i=0;i<SORT_OBJECT_NUM;i++)
	{
		objectName[i] = i;
	}
	TRACE("\n");			
	for(int w=0;w<SORT_OBJECT_NUM;w++)
	{
		TRACE("%d ",sortObject[objectName[w]].iNumber);
	}
	//选择排序
	for(i=0;i<SORT_OBJECT_NUM;i++) 
	{ 
		int iPos;
		iPos = i;
		for(int j=i+1;j<SORT_OBJECT_NUM;j++) 
		{ 
			if(sortObject[objectName[j]].iNumber < sortObject[objectName[iPos]].iNumber) 
			{
				iPos = j;
			}
		}
		if(iPos!=i)
		{
			//交换序号
			int iTemp;
			iTemp = sortObject[objectName[iPos]].iSeq; 
			sortObject[objectName[iPos]].iSeq = sortObject[objectName[i]].iSeq; 
			sortObject[objectName[i]].iSeq = iTemp; 
			//交换对象名
			iTemp = objectName[iPos];
			objectName[iPos] = objectName[i];
			objectName[i] = iTemp;
			//显示变化
			CString strName;
			CString strNum;				
			//显示iPos位置的对象
			strName.Format("%d",sortObject[objectName[iPos]].iName);		
			dc.TextOut(objectCoord[sortObject[objectName[iPos]].iSeq].x-5,
				objectCoord[sortObject[objectName[iPos]].iSeq].y-8,
				strName);
			if(sortObject[objectName[iPos]].iNumber<1000)
			{				
				strNum.Format("  %d",sortObject[objectName[iPos]].iNumber);
			}
			else
			{
				strNum.Format("%d",sortObject[objectName[iPos]].iNumber);
			}
			dc.TextOut(objectCoord[sortObject[objectName[iPos]].iSeq].x-15,
				objectCoord[sortObject[objectName[iPos]].iSeq].y-30,
				strNum);
			//显示i位置的对象
			strName.Format("%d",sortObject[objectName[i]].iName);		
			dc.TextOut(objectCoord[sortObject[objectName[i]].iSeq].x-5,
				objectCoord[sortObject[objectName[i]].iSeq].y-8,
				strName);
			if(sortObject[objectName[i]].iNumber<1000)
			{
				strNum.Format("  %d",sortObject[objectName[i]].iNumber);		
			}
			else
			{
				strNum.Format("%d",sortObject[objectName[i]].iNumber);	
			}
			dc.TextOut(objectCoord[sortObject[objectName[i]].iSeq].x-15,
				objectCoord[sortObject[objectName[i]].iSeq].y-30,
				strNum);
			
			TRACE("\n");			
			for(int w=0;w<SORT_OBJECT_NUM;w++)
			{
				TRACE("%d ",sortObject[objectName[w]].iNumber);
			}
			//延迟1S进行下一轮排序以便于动画显示
			Sleep(1000);				
		} 			
	}	
}

void CSortDlg::OnInsertSort() 
{
	CClientDC dc(this) ;
	dc.SetBkColor(RGB(100,100,255));
	dc.FillRect(&CRect(0,0,250,150),&CBrush(RGB(100,100,255)));
	int objectName[SORT_OBJECT_NUM]; ////每个位置对应的成员名
	//初始化每个位置对应的成员
	for(int i=0;i<SORT_OBJECT_NUM;i++)
	{
		objectName[i] = i;
	}	
	TRACE("\n");			
	for(int w=0;w<SORT_OBJECT_NUM;w++)
	{
		TRACE("%d ",sortObject[objectName[w]].iNumber);
	}
	//插入排序
	for(i=1;i<SORT_OBJECT_NUM;i++) 
	{ 
		int iPos = i-1;
		int iName = objectName[i]; 
		CString strName,strNum;
		
		while(iPos>=0 && sortObject[iName].iNumber < sortObject[objectName[iPos]].iNumber)
		{
			objectName[iPos+1] = objectName[iPos];
			sortObject[objectName[iPos]].iSeq += 1;	
			//显示iPos+1位置的对象
			strName.Format("%d",objectName[iPos+1]);		
			dc.TextOut(objectCoord[iPos+1].x-5,
				objectCoord[iPos+1].y-8,
				strName);
			if(sortObject[objectName[iPos+1]].iNumber<1000)
			{
				strNum.Format("  %d",sortObject[objectName[iPos+1]].iNumber);		
			}
			else
			{
				strNum.Format("%d",sortObject[objectName[iPos+1]].iNumber);	
			}
			dc.TextOut(objectCoord[iPos+1].x-15,
				objectCoord[iPos+1].y-30,
				strNum);
			
			iPos--;
			Sleep(1000);	
		}
		objectName[iPos+1] = iName;
		sortObject[objectName[iPos+1]].iSeq = iPos+1;
		//显示iPos+1位置的对象
		strName.Format("%d",objectName[iPos+1]);		
		dc.TextOut(objectCoord[iPos+1].x-5,
			objectCoord[iPos+1].y-8,
			strName);
		if(sortObject[objectName[iPos+1]].iNumber<1000)
		{
			strNum.Format("  %d",sortObject[objectName[iPos+1]].iNumber);		
		}
		else
		{
			strNum.Format("%d",sortObject[objectName[iPos+1]].iNumber);	
		}
		
		dc.TextOut(objectCoord[iPos+1].x-15,
			objectCoord[iPos+1].y-30,
			strNum);
		
		TRACE("\n");			
		for(int w=0;w<SORT_OBJECT_NUM;w++)
		{
			TRACE("%d ",sortObject[objectName[w]].iNumber);
		}
		Sleep(1000);	
	}
}

void QuickSort(int objectName[], CDC &dc, int left, int right)
{
	int i, j;
	int middle, iTemp;
	i = left;
	j = right;
	middle = sortObject[objectName[(left+right)/2]].iNumber; //求中间值
	do
	{
		while ((sortObject[objectName[i]].iNumber < middle) && (i < right)) //从左扫描大于中值的数
			i++;
		while ((sortObject[objectName[j]].iNumber > middle) && (j > left)) //从右扫描小于中值的数
			j--;
		if (i < j) //找到了一对值
		{
			//交换成员名
			iTemp = objectName[i];
			objectName[i] = objectName[j];
			objectName[j] = iTemp;
			//交换序号
			iTemp = sortObject[objectName[i]].iSeq;
			sortObject[objectName[i]].iSeq = sortObject[objectName[j]].iSeq;
			sortObject[objectName[j]].iSeq = iTemp;
			//显示变化
			CString strName;
			CString strNum;				
			//显示j位置的对象
			strName.Format("%d",objectName[j]);		
			dc.TextOut(objectCoord[j].x-5,
				objectCoord[j].y-8,
				strName);
			if(sortObject[objectName[j]].iNumber<1000)
			{				
				strNum.Format("  %d",sortObject[objectName[j]].iNumber);
			}
			else
			{
				strNum.Format("%d",sortObject[objectName[j]].iNumber);
			}
			dc.TextOut(objectCoord[j].x-15,
				objectCoord[j].y-30,
				strNum);
			//显示i位置的对象
			strName.Format("%d",objectName[i]);		
			dc.TextOut(objectCoord[i].x-5,
				objectCoord[i].y-8,
				strName);
			if(sortObject[objectName[i]].iNumber<1000)
			{
				strNum.Format("  %d",sortObject[objectName[i]].iNumber);		
			}
			else
			{
				strNum.Format("%d",sortObject[objectName[i]].iNumber);	
			}
			dc.TextOut(objectCoord[i].x-15,
				objectCoord[i].y-30,
				strNum);
			
			TRACE("\n");			
			for(int w=0;w<SORT_OBJECT_NUM;w++)
			{
				TRACE("%d ",sortObject[objectName[w]].iNumber);
			}
			//延迟1S进行下一轮排序以便于动画显示
			Sleep(1000);		
			
			i++;
			j--;
		}
        else if (i==j)
		{
			i++;
			j--;
		}
	} while (i <= j) ; //如果两边扫描的下标交错,就停止(完成一次)
	//当左边部分有值(left<j),递归左半边
	if(left<j) 
		QuickSort (objectName,dc,left,j); 
	//当右边部分有值(right>i),递归右半边
	if(right>i) 
		QuickSort (objectName,dc,i,right); 	
}

void CSortDlg::OnQuickSort() 
{	
	CClientDC dc(this) ;
	dc.SetBkColor(RGB(100,100,255));
	dc.FillRect(&CRect(0,0,250,150),&CBrush(RGB(100,100,255)));
	int objectName[SORT_OBJECT_NUM]; ////每个位置对应的成员名
	//初始化每个位置对应的成员
	for(int i=0;i<SORT_OBJECT_NUM;i++)
	{
		objectName[i] = i;
	}	
	QuickSort(objectName,dc,0,SORT_OBJECT_NUM-1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -