请教如何统计快速排序里元素的比较次数和交换次数

  • Post author:
  • Post category:其他


我自己放了comparison Counter 和 swap Counter,可是不确定是不是对的

请高手帮我看下,非常感谢

void quickSortFirst(int data[],int lo,int hi)
{ 
	int pivot,l,r,temp;
	l = lo; 
	r = hi; 
	pivot=data[lo];	// choose First element as pivot
	
	while(l<r)  
	{  
		while(data[l]<pivot) 
		{
			++l;
			compCounterFirst++;	   // comparison counter ++
		}
		 
		while(data[r]>pivot) 
		{
			--r;
			compCounterFirst++;	   // comparison counter ++
		}
		     
		if(l>=r) 
			break;  
		
		temp = data[l];  
		data[l] = data[r];  
		data[r] = temp; 
		
		swapCounterFirst++;	   	   // swap counter ++
		 
		++l;  
		--r;  
	} 

	if(l==r) 
		l++; 

	if(lo<r) 
		quickSortFirst(data,lo,l-1); 
	if(l<hi) 
		quickSortFirst(data,r+1,hi); 
}

以下是完整代码我的程序的

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cstring>
#include <ctime>
using namespace std;

const int MAX=100000;

static int swapCounterFirst=0;
static int compCounterFirst=0;

static int swapCounterMedian=0;
static int compCounterMedian=0;

void intiArr (string, int[], int&);

void printArr (int[], int, int);

void heap_sort(int [], int);

void quickSortFirst(int [], int, int);

void quickSortMedian(int [], int, int);

int main ()
{
	int size=0;
	
	int totalNumberOfSwap=0;
	int totalNumberOfComparison=0;
	// int oriArr[MAX];

	int oriArr[]={4, 2, 7, 8, 1, 9, 3, 6, 5};

	size=sizeof(oriArr)/sizeof(int);

	cout<<"The source array:"<<endl;

	cout<<"Total number of integers is "<<size<<endl;

	int printWay=1;
	int sortWay=1;

	cout<<"Please select layout of display (1 for line, 2 for space)"<<endl;
	// cin>>printWay;	// let user select layout of display

	printArr(oriArr, size, printWay);	// print array on screen

	cout<<"Please select algorithm to sort array:"<<endl
		<<"\t1. heap sort"<<endl
		<<"\t2. quick sort (using the first element of the list as pivot element)"<<endl
		<<"\t3. quick sort (using the median element of the list as pivot element)"<<endl
		<<"Pleae enter your option: ";

	cin>>sortWay;	// let user select algorithm to sort array

	if(sortWay==1)
	{
		cout<<"After heap sort:"<<endl;

		heap_sort(oriArr, size);	//	heap sort the array
	}
	else if(sortWay==2)
	{
		cout<<"After quick sort (using the first element as pivot element):"<<endl;

		// recursive quick sort array using the first element
		quickSortFirst(oriArr, 0, size-1);	  
		
		totalNumberOfSwap = swapCounterFirst;
		totalNumberOfComparison = compCounterFirst;	    
	}
	else if(sortWay==3)
	{
		cout<<"After quick sort (using the median element as pivot element):"<<endl;

		// quick sort array using the median element
		quickSortMedian(oriArr, 0, size-1);
		
		totalNumberOfSwap = swapCounterMedian;
		totalNumberOfComparison = compCounterMedian;
	}
	else
	{
		cout<<"Your input is incorrect"<<endl;
	}

	printWay=2;

	printArr(oriArr, size, printWay);

	cout<<endl<<endl<<"Total number of integers = "<<size<<endl
		<<"Total Number Of Swap = "<<totalNumberOfSwap<<endl
		<<"Total Number Of Comparison = "<<totalNumberOfComparison<<endl;
	
	return 0;
}

void printArr (int a[], int size, int printWay)
{
	if(printWay == 1)
	{
		for(int i=0; i<size; i++)
		{
			cout<<a[i]<<endl;
		}
	}
	else if(printWay == 2)
	{
		for(int i=0; i<size; i++)
		{
			if(i!=0 && i%10==0)
				cout<<endl;

			cout<<a[i]<<"\t";
		}
	}
	else
	{
		cout<<"Your input is incorrect"<<endl;
	}
}


// ------------------- quick sort use FIRST element as pivot-------------------
void quickSortFirst(int data[],int lo,int hi)
{ 
	int pivot,l,r,temp;
	l = lo; 
	r = hi; 
	pivot=data[lo];	// choose First element as pivot
	
	while(l<r)  
	{  
		while(data[l]<pivot) 
		{
			++l;
			compCounterFirst++;	   // comparison counter ++
		}
		 
		while(data[r]>pivot) 
		{
			--r;
			compCounterFirst++;	   // comparison counter ++
		}
		     
		if(l>=r) 
			break;  
		
		temp = data[l];  
		data[l] = data[r];  
		data[r] = temp; 
		
		swapCounterFirst++;	   	   // swap counter ++
		 
		++l;  
		--r;  
	} 

	if(l==r) 
		l++; 

	if(lo<r) 
		quickSortFirst(data,lo,l-1); 
	if(l<hi) 
		quickSortFirst(data,r+1,hi); 
}
// ------------------- quick sort -------------------

// ------------------- quick sort use MEDIAN element as pivot-------------------
void quickSortMedian(int data[],int lo,int hi)
{ 
	int pivot,l,r,temp;
	l = lo; 
	r = hi; 
	pivot=data[(lo+hi)/2];	//	choose Median element as pivot
	
	while(l<r)  
	{  
		while(data[l]<pivot) 
		{
			++l;
			compCounterMedian++;	// comparison counter ++
		}
		 
		while(data[r]>pivot) 
		{
			--r;
			compCounterMedian++;	// comparison counter ++
		}
		     
		if(l>=r) 
			break;  
		
		temp = data[l];  
		data[l] = data[r];  
		data[r] = temp; 
		
		swapCounterMedian++;		// swap counter ++
		 
		++l;  
		--r;  
	} 

	if(l==r) 
		l++; 

	if(lo<r) 
		quickSortMedian(data,lo,l-1); 
	if(l<hi) 
		quickSortMedian(data,r+1,hi); 
}
// ------------------- quick sort -------------------


// ------------------- heap sort -------------------
void max_heapify(int data[],int i,int heapsize)
{
    int l=2*i+1;
    int r=2*i+2;
    int largest=i;
    if(l<heapsize&&data[l]>data[i])
    {
        largest=l;
    }
    if(r<heapsize&&data[r]>data[largest])
    {
        largest=r;
    }
    if(largest!=i)
    {
        int temp=data[largest];
        data[largest]=data[i];
        data[i]=temp;
        max_heapify(data,largest,heapsize);
    }
}

void bulid_max_heap(int data[],int heapsize)
{
    for(int i=heapsize/2-1;i>=0;i--)
         max_heapify(data,i,heapsize);
}

void heap_sort(int data[],int heapsize)
{
     bulid_max_heap(data,heapsize);
     for(int i=heapsize-1;i>0;i--)
     {
         int t=data[0];
         data[0]=data[i];
         data[i]=t;
         max_heapify(data,0,i);

     }
}
// ------------------- heap sort -------------------



版权声明:本文为mango16原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。