1. 程式人生 > >《程式設計基礎》實驗題目1 二維陣列 氣泡排序

《程式設計基礎》實驗題目1 二維陣列 氣泡排序

題目:編寫函式,對於給定的二維整型陣列,首先對每行從小到大排序,之後對每列從小到大排序;反覆執 行上述排序過程,直到沒有變動為止。注:作為實參的二維整型陣列,每行元素個數不低於 3 且每列 元素個數不低於 4

演算法分析:

1.      為方便傳遞引數,將二維陣列儲存為結構體Matrix,含有分量二維陣列nums,行數line,列數column

  否則傳遞陣列時還要帶著行列兩個int變數。

  另外也可以使函式更加簡潔

2.      將排序分為三個函式 sort(總排序),sortLine

(行排序),sortColumn(列排序)

行排序:用氣泡排序對每行分別進行排序,並用have_change變數記錄是否有資料交換,若沒有說明所有的行已經排好序,返回have_change=0;有資料交換返回have_change=1。列排序同理。

sort函式呼叫行排序和列排序函式,當它們的返回值都為0時,所有行列都不再有變動,即排好序。

  程式設計習慣改良:

 

  1. .   .    變數的命名:之前我都是習慣用xxx__aaa的形式,雖然含義明顯但是冗長難以一眼看懂。這次函式變數的命名能短則短,能看懂就好。也需要適當有一些註釋。vs右鍵重新命名非常方便.
  2.          git程式碼庫很方便的建立分支和回滾。

  完整程式碼:

  

  1 #include<stdio.h>
  2 #define MAX_LEN 20 //定義隨機生成的二維陣列的最大列(行)數 
  3 //為方便傳參,將二維陣列封裝成矩陣結構體,nums儲存二維陣列,line為行數,column為列數
  4 typedef struct myMatrix {
  5     int** nums;
  6     int line;
  7     int column;
  8 } Matrix;
9 //二重迴圈列印陣列 10 void showMartix(Matrix* matrix) { 11 int line = matrix->line; 12 int column = matrix->column; 13 for (int i = 0; i < line; i++) { 14 for (int j = 0; j < column; j++) { 15 printf("%3d ", matrix->nums[i][j]); 16 } 17 printf("\n"); 18 } 19 } 20 //交換s1,s2 21 void exchangeInt(int* s1, int* s2) { 22 23 int temp = *s1; 24 *s1 = *s2; 25 *s2 = temp; 26 } 27 //從鍵盤鍵入陣列 28 void initMatrix(Matrix* matrix) { 29 int line, column; 30 printf("please input line num and column num,intervaled by space:\n"); 31 scanf("%d %d", &line, &column); 32 matrix->line = line; matrix->column = column; 33 matrix->nums=(int**)malloc(sizeof(int*)*line); 34 for (int i = 0; i < line; i++) 35 *(matrix->nums + i) = malloc(sizeof(int)*column); 36 printf("please input nums by line:\n"); 37 for (int i = 0; i < line; i++) { 38 for (int j = 0; j < column; j++) { 39 scanf("%d", &matrix->nums[i][j]); 40 } 41 } 42 } 43 //隨機生成一個二維陣列 44 void RandomInitMatrix(Matrix* matrix) { 45 srand((int)time(NULL)); 46 //隨機生成行數、列數,最大為MAX_LEN 47 int line=rand()% MAX_LEN, column=rand()% MAX_LEN; 48 matrix->line = line; matrix->column = column; 49 //申請空間,併為各個元素隨機賦值 50 matrix->nums = (int**)malloc(sizeof(int*)*line); 51 for (int i = 0; i < line; i++) 52 *(matrix->nums + i) = malloc(sizeof(int)*column); 53 for (int i = 0; i < line; i++) { 54 for (int j = 0; j < column; j++) { 55 matrix->nums[i][j]=rand()%100; 56 } 57 } 58 } 59 //對每行進行氣泡排序,返回是否有排序(0,1) 60 int sortLine(Matrix* matrix) { 61 //記錄是否本次排序中發生了資料交換 62 int have_change=0; 63 //對每行進行迴圈 64 for (int i = 0; i < matrix->line; i++) { 65 //對當前行進行氣泡排序 66 //bound為邊界,初始為最右邊,邊界逐漸左移到0 67 int bound = matrix->column; 68 while (bound != 0) { 69 //記錄最後交換的位置 70 int last_change = 0; 71 for (int j = 0; j < bound-1; j++) { 72 //如果出現反序對就進行資料交換 73 if (matrix->nums[i][j] > matrix->nums[i][j + 1]) { 74 exchangeInt(&matrix->nums[i][j], &matrix->nums[i][j + 1]); 75 have_change = 1; 76 last_change = j+1; 77 } 78 } 79 //邊界更新為最後交換的位置,此邊界後沒有反序對,即已經排好序 80 bound = last_change; 81 } 82 } 83 return have_change; 84 } 85 //對每列進行氣泡排序,返回是否有排序(0,1) 86 int sortColumn(Matrix* matrix) { 87 //具體演算法與行排序相似,不再重複 88 int have_change = 0; 89 for (int i = 0; i < matrix->column; i++) { 90 int bound = matrix->line; 91 while (bound != 0) { 92 int last_change = 0; 93 for (int j = 0; j < bound - 1; j++) { 94 if (matrix->nums[j][i] > matrix->nums[j+1][i]) { 95 exchangeInt(&matrix->nums[j][i], &matrix->nums[j+1][i]); 96 have_change = 1; 97 last_change = j + 1; 98 } 99 } 100 bound = last_change; 101 } 102 } 103 return have_change; 104 } 105 //對二維陣列排序 106 void sort(Matrix* matrix) { 107 //對每行每列迴圈排序直到行排序和列排序都不再有改動 108 while (sortLine(matrix) != 0 && sortColumn(matrix) != 0) { 109 } 110 } 111 112 113 int main() { 114 Matrix m; 115 RandomInitMatrix(&m);//測試用的二維陣列是隨機生成的,如需鍵盤鍵入可使用initMarix函式 116 printf("\n random Matrix before sorting:\n"); 117 showMartix(&m); 118 sort(&m); 119 printf("\n sorted:\n"); 120 showMartix(&m); 121 free(m.nums); 122 }

 

The end