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

📄 sort.cpp

📁 冒泡
💻 CPP
字号:
#include <iostream>
#include <fstream>
#include <iomanip>
#include <conio.h>
#include <ctime>
#include <string>
#include <stdio.h>

using namespace std;

#define MAXSIZE 11200

typedef struct
{
	int num[MAXSIZE+1];
	int length;
}SqList;


void LoadFileData(int number[], int &length, char *filename)
{
	int i;
	i=1;
	fstream indata(filename);
	while(indata>>number[i]){
		i++;
	}
	length=--i;
	indata.close();
}


void SaveSortData(int number[], int length, char *filename)
{
	fstream outdata(filename, ios::out);
	for(int i=1; i<length+1; i++)
	{
		outdata<<number[i]<<" ";
	}
	outdata.close();
}


void RandomNumber(int number[], int n, int max, bool flag)
{
	srand((unsigned)time(NULL));
	for(int i=1; i<n+1; i++)
	{
		number[i]=rand()%max;
	}
	if(flag)
	{
		SaveSortData(number, n, "temp.txt");
	}
}

void Display(int number[], int n)
{
	for(int i=1; i<=n; i++)
	{
		printf("%d ", number[i]);
	}
}


//各種排序算法在這裡

//冒泡
void BubbleSort(SqList &list, int &mov, int &cmp)
{
	bool flag=true;
	int temp;
	for (int j=1; j<list.length&&flag; j++)
	{
		flag=false;
		for(int i=1; i<=list.length-j; i++)
		{
			cmp++;
			if(list.num[i]>list.num[i+1])
			{
				temp=list.num[i];
				list.num[i]=list.num[i+1];
				list.num[i+1]=temp;
				mov++;
				flag=true;
			}
		}
	}
}

//堆
void HeapAdjust(int num[], int s, int m, int &mov, int &cmp)
{
	int j, rc;
	rc=num[s];
	mov++;

	for(j=s*2; j<=m; j*=2)
	{
		cmp+=2;
		if(j<m&&num[j]<num[j+1])
			j++;
		if(rc>num[j])
			break;
		num[s]=num[j];
		s=j;
		mov++;
	}

	num[s]=rc;
	mov++;
}

void HeapSort(SqList &list, int &mov, int &cmp)
{
	int i,temp;

	for(i=list.length/2; i>0; i--)
	{
		HeapAdjust(list.num, i, list.length, mov, cmp);
	}

	for(i=list.length; i>1; i--)
	{
		temp=list.num[1];
		list.num[1]=list.num[i];
		list.num[i]=temp;
		mov+=3;
		
		HeapAdjust(list.num,1,i-1,mov,cmp);
	}
}

//快速

int Partition(int data[], int low, int high, int &mov, int &cmp)
{
	int pivotkey;

	data[0]=data[low];
	pivotkey=data[low];
	mov+=2;

	while(low<high)
	{
		while(low<high&&data[high]>=pivotkey)
		{
			cmp++;
			high--;
		}
		data[low]=data[high];


		while(low<high&&data[low]<=pivotkey)
		{
			cmp++;
			low++;
		}
		data[high]=data[low];
		cmp+=2;
		mov+=2;
	}

	data[low]=data[0];
	mov++;
	return low;
}

void QkSort(int data[], int low, int high, int &mov, int &cmp)
{
	int pivotloc;
	if(low<high)
	{
		pivotloc=Partition(data, low, high, mov, cmp);
		QkSort(data, low, pivotloc-1, mov, cmp);
		QkSort(data, pivotloc+1, high, mov,cmp);
	}
}

void QuickSort(SqList &list, int &mov, int &cmp)
{
	QkSort(list.num, 1, list.length, mov, cmp);
}



//簡單選擇

void SelectSort(SqList &list, int &mov, int &cmp)
{
	int i=0, j=0;
	int min,temp;
	for(i=1; i<list.length; i++)
	{
		min=i;
		for(j=i+1; j<=list.length; j++)
		{
			cmp++;
			if(list.num[j]<list.num[min])
			{
				min=j;
			}
		}

		if(min!=i)
		{
			temp=list.num[i];
			list.num[i]=list.num[min];
			list.num[min]=temp;
			mov+=3;
		}
	}
}

//直接插入
void InsertSort(SqList &list, int &mov, int &cmp)
{
	for(int i=2; i<=list.length; i++)
	{
		cmp++;
		if(list.num[i]<list.num[i-1])
		{
			list.num[0]=list.num[i];
			list.num[i]=list.num[i-1];
			mov=mov+2;
			cmp++;

			for(int j=i-2; list.num[0]<list.num[j]; --j,cmp++,mov++)
			{
				list.num[j+1]=list.num[j];
			}

			list.num[j+1]=list.num[0];
			mov++;
		}
	}
}




void CompareDisplay(int mov, int cmp, string str)
{
	cout<<str;
	cout<<"Mov:"<<setw(10)<<mov;
	cout<<"\t\tcmp:"<<setw(10)<<cmp<<endl;
}

void Compare(SqList &list, int length)
{
	int mov=0, cmp=0;
	list.length=length;
	//排序算法引用寫在這裡
	
	LoadFileData(list.num, list.length, "temp.txt");
	BubbleSort(list, mov, cmp); 
	CompareDisplay(mov, cmp, "冒泡排序:  "); 
	SaveSortData(list.num, list.length, "BubbleSort.txt"); 
	
	mov=0; cmp=0;
	LoadFileData(list.num, list.length, "temp.txt");
	HeapSort(list, mov, cmp); 
	CompareDisplay(mov, cmp, "堆排序:  "); 
	SaveSortData(list.num, list.length, "HeapSort.txt"); 

	mov=0; cmp=0;
	LoadFileData(list.num, list.length, "temp.txt");
	QuickSort(list, mov, cmp); 
	CompareDisplay(mov, cmp, "快速排序:  "); 
	SaveSortData(list.num, list.length, "QuickSort.txt"); 
	
	mov=0; cmp=0;
	LoadFileData(list.num, list.length, "temp.txt");
	SelectSort(list, mov, cmp); 
	CompareDisplay(mov, cmp, "选择排序:  "); 
	SaveSortData(list.num, list.length, "SelectSort.txt"); 

	mov=0; cmp=0;
	LoadFileData(list.num, list.length, "temp.txt");
	InsertSort(list, mov, cmp); 
	CompareDisplay(mov, cmp, "插入排序:  "); 
	SaveSortData(list.num, list.length, "InsertSort.txt"); 


	
	
	printf("all sort\n");
}


void MainMenu(SqList &list, int mov, int cmp, int &length)
{
	printf("\n\t1.随机生成数\n");
	printf("\t2.所有排序\n");
	printf("\t0.离开\n");
	int select=0;
	scanf("%d",&select);
	switch(select)
	{
	case 1: 
		printf("输入个数:\n");
		scanf("%d",&length);
		RandomNumber(list.num, length, 1000, true);
		list.length=length;
		Display(list.num, list.length);
		break;
	case 2:
		Compare(list, length);
		break;
	case 0:
		exit(0);
	}
	LoadFileData(list.num, list.length, "temp.txt");
}


int main()
{
	SqList list;
	int length=0;

	while(true)
	{
		MainMenu(list, 0, 0, length);
	}
	getch();
	return 0;
}










⌨️ 快捷键说明

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