1. 程式人生 > >c++課後題(2) 陣列排序

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>
#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;
}