c++課後題(2) 陣列排序
阿新 • • 發佈:2018-12-17
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;
}