c++课后题(2) 数组排序

2.排序算法:

输入: 一个数组

1. 冒泡排序

2. 选择排序  (每次选择剩余序列中最小的数)

#include <iostream>
#include <iomanip>
using namespace std;
const int SIZE_LEN=10;

void bulb_sort(int [], int );
void select_sort(int [], int); 
void display_array(int [], int);

// 冒泡排序  选择排序 
int main(int argc, char *argv[])
{
	int a[SIZE_LEN];
	cout << "Enter ten numbers: " << endl;
	for(int i=0; i<SIZE_LEN; i++)
	{
		cin >> a[i];
	}
	cout << "Enter end" << endl; 
	//bulb_sort(a, SIZE_LEN);
	select_sort(a, SIZE_LEN);
	display_array(a, SIZE_LEN);
	return 0;
}


void bulb_sort(int seq[], int SIZE) // 冒泡排序 
 {
 	//int len = sizeof(seq) / sizeof(int);
 	//bool ischanged = true;
 	while(true)
 	{
 		bool ischanged = false;  // 记录数据是否发生了调换 
	   	for(int i=0; i<SIZE-1; i++)
    	{
		 	if(seq[i]>seq[i+1])   // 交换相邻的值 
		 	{
		 		int temp = seq[i];
		 		seq[i] = seq[i+1];
		 		seq[i+1] = temp;
		 		ischanged = true;
		 	}	 	
        }
        if(!ischanged)  // 知道数据不再发生调换 
           break;		
    }
 }

void select_sort(int seq[], int SIZE)
{
	for(int i=0; i<SIZE-1; i++)
	{
		int min_num = seq[i];    
		int min_index = i;
		for(int j=i; j<SIZE; j++)
		{
		   if(seq[j]<min_num)
		   {
   			    min_num = seq[j];   // 更新最小值 
   			    min_index = j;      // 最小值的索引 
   		   }
		     	
		}
		int tmp = seq[i];    //最小值与最小位置的数进行交换 
		seq[i] = seq[min_index];
		seq[min_index] = tmp;
	}
}

void display_array(int seq[], int SIZE) // c++将数组作为参数,实际传递的是指针 
{
	for(int i=0; i<SIZE; i++)
	{
		cout << setw(4) << seq[i];
	}
	cout << endl;
}


储物柜问题:
问题描述:100个柜子,初始时都关闭,第一个人打开所有的,第二个人从第二个开始,每个两个关闭,从第三个人开始,后续来的第n个人,从第n个柜子开始,每隔n个柜子改变一次状态。最后开着的柜子:

#include <iostream>
#include <iomanip>
using namespace std;
const int SIZE_LEN=100;

int reversr_state(int);
int main(int argc, char *argv[])
{
    int a[SIZE_LEN] = {0};
	for(int i=0; i<SIZE_LEN; i++)
	{
		if(i==0)
		{
			for(int j=0; j<SIZE_LEN; j++)
			    a[j] = 1;   // 第一个学生吧所有的柜子门打开 
		}
		else if(i==1)  // 第二个学生从第二个柜子开始,每个两个柜子关闭 
		{
			for(int j=i; j<SIZE_LEN; j=j+2)
			    a[j] = 0;     
		}
		
		else   // 后面的第n个学生,每隔n个柜子改变柜子的状态 
		{
			for(int j=i; j<SIZE_LEN; j=j+i)
			{
				a[j] = reversr_state(a[j]);
			}
		}      
	}
	cout << "The following closet is open: " << endl;
	int counter = 0;
	for(int i=0; i<SIZE_LEN; i++)
	{
		if(a[i]==1)
		{
			cout << setw(4) << i+1;
			counter++;
			if(counter%10==0)
			   cout << endl;
		}
	} 
	cout << endl;
	return 0;
}

int reversr_state(int num)
{
	if(num==0)
	   return 1;
    else
       return 0;
}


插入排序:

插入排序的思想是从待排序的序列中选择一个元素,插入到已经有序的元素中,对于整个待排序的序列,一般会认为序列的第一个元素是有序的,从第二个元素开始插入。

#include <iostream>
using namespace std;

// 插入排序
template<typename T>
void insertSort(T list[], int n)
{
	// 插入排序, 参数:list待排序的数组  n数组的大小
	for(int i=1; i<n; i++)
	{
		int index = -1;   // 插入的位置 
		for(int j=0; j<i; j++)
		{
			if(list[i]<list[j])
			{
				index = j;
				break;
			}
		}
		// 插入操作
		if(index>=0)
		{
			T temp = list[i];
			for(int pos=i; pos>index; pos--)
			{
				list[pos] = list[pos-1];
			} 
			// 插入元素
			list[index] = temp; 
		}
	} 
} 


int main(int argc, char *argv[])
{
	int a[10] = {4, 32, 23, 11, 9, 1, 89, 98, 1, 0};
	insertSort(a, 10);
	for(int i=0; i<10; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
	return 0;
}

运行结果:

高尔顿盒子问题:

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <time.h>
using namespace std;
#define RAND_MAX_FLOAT static_cast<float>(RAND_MAX)
const int para = 11;  // 道尔顿板的大小 
const int para_board_width = 41;
const int test_num = 400;
void result_display(int [], int);
int array_sum(int [], int);
void array_disp(int [], int);

int main(int argc, char *argv[])
{
	srand(time(0));
	int process[para];
	int outcome[para_board_width] = {0};
	
	for(int i=0; i<test_num; i++)  // 进行100次实验 
	{
	   for(int j=0; j<para; j++)   // 向下落11次 
	   {
	   	  double tmp = rand()/RAND_MAX_FLOAT;
	   	  if(tmp>0.5) // 向右偏
	   	  {
			 process[j] = 1;
			 cout << "R";
	   	  }
		  else
		  {
		     process[j] = -1;
			 cout << "L";
		  }
   	   }
   	   cout << endl;
	   int middle = para_board_width/2;  // 道尔顿板的中间位置
	   int index = array_sum(process, para) + middle; 
	   // 边界条件设置
	   if(index<0)
	      index = 0;
	   if(index>para_board_width-1)
	      index = para_board_width - 1;
	   cout << index << endl; 
	   outcome[index] += 1; 
	}
	 
	array_disp(outcome, para_board_width);
	result_display(outcome, para_board_width);
	
	//int c[9] = {0,3,0,3,3,0,3,0,1};
	//result_display(c, 9);
	//cout << array_sum(c, 9) << endl;
	//array_disp(c, 9);
	//return 0;
}


void result_display(int array[], int SIZE_LEN)  // 输出最后的结果 
{
    int max = 0;
    // 找到数组的最大值 
	for(int i=0; i<SIZE_LEN; i++)
	{
		if(array[i]>max)
           max = array[i];
        
	}  // max代表最终要显示多少行 
	for(int i=0; i<max; i++)  // 行数 
	{
		for(int j=0; j<SIZE_LEN; j++)
		{
			int delta = max - array[j];
			if(i>=delta)
			{
				cout << "o";
			} 
			else
			{
				cout << " ";
			}
		}
		cout << endl;  // 换行 
	}     
	cout << endl;        
} 


int array_sum(int array[], int array_size)
 {
 	int sum = 0;
 	for(int i=0; i<array_size; i++)
 	{
	 	sum += array[i];
    }
    return sum;
 } 

void array_disp(int array[], int array_size)
{
	for(int i=0; i<array_size; i++)
	{
		cout << setw(4) << array[i];
	}
	cout << endl;
}

从数组中查找一个姓名,并且删除这个姓名:
 

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <time.h>
#include <string>
 
using namespace std;

void printArray(string*, int);

int main(int argc, char *argv[])
{
    cout << "Enter the capacity: ";
    int capacity;
    cin >> capacity;
    string* p = new string[capacity];
    cout << "Enter " << capacity << " names: " << endl;
    for(int i=0; i<capacity; i++)
    {
    	cin >> p[i];
    }
    printArray(p, capacity);
    
    cout << "Enter the name you want to delete: ";
    string name;
    cin >> name;
    bool found_flag = false;
    int index;
    for(int i=0; i<capacity; i++)
    {
        if(p[i]==name)
		{
			found_flag = true;
			index = i;
			break;
		}	
    }
    if(found_flag)  // 找到了
	{
		for(int k=index; k<capacity-1; k++)
		{
			p[k] = p[k+1];
		}
		capacity--;
		cout << "Name " << name << " is successfully deleted from nameList" << endl;
	}
	else
	{
		cout << name << " is not in the nameList." << endl;
	}
	printArray(p, capacity); 
	return 0;
}

void printArray(string* nameList, int num)
{
	for(int i=0; i<num; i++)
	{
		cout << nameList[i] << endl;
	}
	cout << endl;
}

------------------------------------------分割线---------------------------------------------------------

 

posted @ 2018-10-23 18:55  Alpha205  阅读(119)  评论(0编辑  收藏  举报