###### tags: `演算法` # *2022/04/13 演算法作業HW01 Full* 原始碼: [https://1drv.ms/u/s!AvwcoqTkdjpWg4w_LgieurJN7iBpew?e=j3kafa](https://1drv.ms/u/s!AvwcoqTkdjpWg4w_LgieurJN7iBpew?e=j3kafa) ``` // // main.c // Algorithm_HW01 // // Created by 吳宥陞 on 2022/4/13. // // Output遞增 #include <stdlib.h> #include <stdio.h> #include <time.h> #include <math.h> #define MAX 20000 #define location_1 "D:\\Increase_Sorted_Output.txt" #define location_2 "D:\\Decrease_Sorted_Output.txt" #define location_3 "D:\\Random_Output.txt" float ExchangeSorted(int*, int); float MergeSorted_Time(int*, int); void Merge(int*, int, int, int); void MergeSort(int*, int, int); void Swap(int*, int*); float QuickSorted_Time(int*, int, int); void QuickSort(int*, int, int); int Partition(int*, int, int); float BubbleSorted(int*, int); float SelectionSorted(int*, int); int main() { clock_t start, end; float Total_Execution_time; start = clock();//Start time FILE *fp_1,*fp_2,*fp_3; fp_1 = fopen(location_1, "w+");//Open the Empty fp_2 = fopen(location_2, "w+"); fp_3 = fopen(location_3, "w+"); srand(time(NULL));//Set the seed float Increase_ExchangeSorted_ExecutionTime, Increase_MergeSorted_ExectionTime, Increase_QuickSorted_ExectionTime, Increase_BubbleSorted_ExectionTime, Increase_SelectionSorted_ExectionTime;//Set the execution time of Increase list float Decrease_ExchangeSorted_ExecutionTime, Decrease_MergeSorted_ExectionTime, Decrease_QuickSorted_ExectionTime, Decrease_BubbleSorted_ExectionTime, Decrease_SelectionSorted_ExectionTime;//Set the execution time of Decrease list float Random_ExchangeSorted_ExecutionTime, Random_MergeSorted_ExectionTime, Random_QuickSorted_ExectionTime, Random_BubbleSorted_ExectionTime, Random_SelectionSorted_ExectionTime;//Set the execution time of Random list for (int j = 1; j <= MAX; j++) { /*Allocate the memory size*/ int* matrix_1_v1 = (int*)malloc(j * sizeof(int));//Store the increase matrix int* matrix_1_v2 = (int*)malloc(j * sizeof(int));//Store the increase matrix int* matrix_1_v3 = (int*)malloc(j * sizeof(int));//Store the increase matrix int* matrix_1_v4 = (int*)malloc(j * sizeof(int));//Store the increase matrix int* matrix_1_v5 = (int*)malloc(j * sizeof(int));//Store the increase matrix int* matrix_2_v1 = (int*)malloc(j * sizeof(int));//Store the increase matrix int* matrix_2_v2 = (int*)malloc(j * sizeof(int));//Store the increase matrix int* matrix_2_v3 = (int*)malloc(j * sizeof(int));//Store the increase matrix int* matrix_2_v4 = (int*)malloc(j * sizeof(int));//Store the increase matrix int* matrix_2_v5 = (int*)malloc(j * sizeof(int));//Store the increase matrix int* matrix_3_v1 = (int*)malloc(j * sizeof(int));//Store the increase matrix int* matrix_3_v2 = (int*)malloc(j * sizeof(int));//Store the increase matrix int* matrix_3_v3 = (int*)malloc(j * sizeof(int));//Store the increase matrix int* matrix_3_v4 = (int*)malloc(j * sizeof(int));//Store the increase matrix int* matrix_3_v5 = (int*)malloc(j * sizeof(int));//Store the increase matrix //Initial Matrix for (int i = 0; i < j; i++) { matrix_1_v1[i] = matrix_1_v2[i] = matrix_1_v3[i] = matrix_1_v4[i] = matrix_1_v5[i] = 0.0; matrix_2_v1[i] = matrix_2_v2[i] = matrix_2_v3[i] = matrix_2_v4[i] = matrix_2_v5[i] = 0.0; matrix_3_v1[i] = matrix_3_v2[i] = matrix_3_v3[i] = matrix_3_v4[i] = matrix_3_v5[i] = 0.0; } //Create Matrix for (int i = 0; i < j; i++) { matrix_1_v1[i] = matrix_1_v2[i] = matrix_1_v3[i] = matrix_1_v4[i] = matrix_1_v5[i] = i + 1;//Increase matrix matrix_2_v1[i] = matrix_2_v2[i] = matrix_2_v3[i] = matrix_2_v4[i] = matrix_2_v5[i] = j - i;//Decrease matrix matrix_3_v1[i] = matrix_3_v2[i] = matrix_3_v3[i] = matrix_3_v4[i] = matrix_3_v5[i] = rand();//Random matrix } printf("%d nth\n", j); /*Show the execution time*/ //Increase matrix Increase_ExchangeSorted_ExecutionTime = ExchangeSorted(matrix_1_v1, j); Increase_MergeSorted_ExectionTime = MergeSorted_Time(matrix_1_v2, j); Increase_QuickSorted_ExectionTime = QuickSorted_Time(matrix_1_v3, 0, j - 1); Increase_BubbleSorted_ExectionTime = BubbleSorted(matrix_1_v4, j); Increase_SelectionSorted_ExectionTime = SelectionSorted(matrix_1_v5, j); //Decrease matrix Decrease_ExchangeSorted_ExecutionTime = ExchangeSorted(matrix_2_v1, j); Decrease_MergeSorted_ExectionTime = MergeSorted_Time(matrix_2_v2, j); Decrease_QuickSorted_ExectionTime = QuickSorted_Time(matrix_2_v3, 0, j - 1); Decrease_BubbleSorted_ExectionTime = BubbleSorted(matrix_2_v4, j); Decrease_SelectionSorted_ExectionTime = SelectionSorted(matrix_2_v5, j); //Random matrix Random_ExchangeSorted_ExecutionTime = ExchangeSorted(matrix_3_v1, j); Random_MergeSorted_ExectionTime = MergeSorted_Time(matrix_3_v2, j); Random_QuickSorted_ExectionTime = QuickSorted_Time(matrix_3_v3, 0, j - 1); Random_BubbleSorted_ExectionTime = BubbleSorted(matrix_3_v4, j); Random_SelectionSorted_ExectionTime = SelectionSorted(matrix_3_v5, j); printf("\n===================================================================================================================\n"); /*printf("Increase_Exchange_ExecutionTime: %f\n\n", Increase_ExchangeSorted_ExecutionTime); printf("Decrease_Exchange_ExecutionTime: %f\n\n", Decrease_ExchangeSorted_ExecutionTime); printf("Random_Exchange_ExecutionTime: %f\n\n", Random_ExchangeSorted_ExecutionTime); printf("===================================================================================================================\n");*/ //Output the data into file if (fp_1 == NULL || fp_2 == NULL || fp_3 == NULL) { printf("Data open Fail"); } else { fprintf(fp_1, "%d\t%f\t", j, Increase_ExchangeSorted_ExecutionTime); fprintf(fp_1, "%f\t", Increase_MergeSorted_ExectionTime); fprintf(fp_1, "%f\t", Increase_QuickSorted_ExectionTime); fprintf(fp_1, "%f\t", Increase_BubbleSorted_ExectionTime); fprintf(fp_1, "%f\n", Increase_SelectionSorted_ExectionTime); fprintf(fp_2, "%d\t%f\t", j, Decrease_ExchangeSorted_ExecutionTime); fprintf(fp_2, "%f\t", Decrease_MergeSorted_ExectionTime); fprintf(fp_2, "%f\t", Decrease_QuickSorted_ExectionTime); fprintf(fp_2, "%f\t", Decrease_BubbleSorted_ExectionTime); fprintf(fp_2, "%f\n", Decrease_SelectionSorted_ExectionTime); fprintf(fp_3, "%d\t%f\t", j, Random_ExchangeSorted_ExecutionTime); fprintf(fp_3, "%f\t", Random_MergeSorted_ExectionTime); fprintf(fp_3, "%f\t", Random_QuickSorted_ExectionTime); fprintf(fp_3, "%f\t", Random_BubbleSorted_ExectionTime); fprintf(fp_3, "%f\n", Random_SelectionSorted_ExectionTime); } free(matrix_1_v1); free(matrix_1_v2); free(matrix_1_v3); free(matrix_1_v4); free(matrix_1_v5);//Free the memory of Increase Matrix free(matrix_2_v1); free(matrix_2_v2); free(matrix_2_v3); free(matrix_2_v4); free(matrix_2_v5);//Free the memory of Decrease Matrix free(matrix_3_v1); free(matrix_3_v2); free(matrix_3_v3); free(matrix_3_v4); free(matrix_3_v5);//Free the memory of random Matrix } fclose(fp_1); fclose(fp_2); fclose(fp_3); end = clock();//End time Total_Execution_time = end - start; printf("\n\n===================================================================================================================\n"); printf("Total Execution Time: %.0f ms\n",Total_Execution_time); } //Swap Function void Swap(int* NUM_1, int* NUM_2) { int Temp = *NUM_1; *NUM_1 = *NUM_2; *NUM_2 = Temp; } //Exchange Sort float ExchangeSorted(int* matrix, int MatrixSize) { clock_t start, end; float execution_time; start = clock();//Start time //Main ExchangeSort Function for (int i = 0; i < MatrixSize - 1; i++) {//Control the Basic Number for (int j = i + 1; j < MatrixSize; j++) {//Control the Compare Number if ((matrix && matrix[i] > matrix[j])) { Swap(&matrix[i], &matrix[j]); } } } end = clock();//End time execution_time = end - start; return execution_time;//Return the Execution Time } //Merge Sort Execution Time float MergeSorted_Time(int* Matrix, int MatrixSize) { clock_t start, end; float execution_time; start = clock();//Start time //Call the MergeSort Function MergeSort(Matrix, 0, MatrixSize-1); end = clock();//End time execution_time = end - start; return execution_time;//Return the Execution Time } //Merge Function void Merge(int* matrix, int Left, int Middle, int Right) { int LeftIndex = Left; int RightIndex = Middle + 1; int TempMatrixLength = Right - Left + 1; int* TempMatrix = (int*)malloc(TempMatrixLength * sizeof(int));//Allocate a temp matrix int TempMatrixIndex = 0; while (LeftIndex <= Middle && RightIndex <= Right) { if (matrix[LeftIndex] <= matrix[RightIndex]) { TempMatrix[TempMatrixIndex] = matrix[LeftIndex]; LeftIndex++; } else { TempMatrix[TempMatrixIndex] = matrix[RightIndex]; RightIndex++; } TempMatrixIndex++; } if (LeftIndex > Middle) { while (RightIndex <= Right) { TempMatrix[TempMatrixIndex] = matrix[RightIndex]; RightIndex++; TempMatrixIndex++; } } else { while (LeftIndex <= Middle) { TempMatrix[TempMatrixIndex] = matrix[LeftIndex]; LeftIndex++; TempMatrixIndex++; } } LeftIndex = Left; for (TempMatrixIndex = 0; TempMatrixIndex < TempMatrixLength; TempMatrixIndex++) { matrix[LeftIndex] = TempMatrix[TempMatrixIndex]; LeftIndex++; } free(TempMatrix); } //Merge Sort Function void MergeSort(int* matrix, int Left, int Right) { if (Left < Right) { int mid = (Left + Right) / 2; MergeSort(matrix, Left, mid); MergeSort(matrix, mid + 1, Right); Merge(matrix, Left, mid, Right); } } //Quick Sort Execution Time float QuickSorted_Time(int* matrix, int Left, int Right) { clock_t start, end; float execution_time; start = clock();//Start time QuickSort(matrix, Left, Right); end = clock();//End time execution_time = end - start; return execution_time; } //Quick Sort Main Function void QuickSort(int* matrix, int Left, int Right) { //Main Quick Sort Function if (Left < Right) { int Pivot = Partition(matrix, Left, Right);//Set the Pivot of index QuickSort(matrix, Left, Pivot - 1);//Deal with the Left of Pivot QuickSort(matrix, Pivot + 1, Right);//Deal with the Right of Pivot } } //Partition int Partition(int* matrix, int Left, int Right) { int Pivot = matrix[Right];//Default Set the Pivot to the Right Element int i = Left - 1; for (int j = Left; j < Right; j++) { if (matrix[j] < Pivot) { i++; Swap(&matrix[i], &matrix[j]); } } i++; Swap(&matrix[i], &matrix[Right]); return i; } //Bubble Sort float BubbleSorted(int* matrix, int MatrixSize) { clock_t start, end; float execution_time; start = clock();//Start time //Main BubbleSort Function for (int i = 0; i < MatrixSize - 1; i++) { for (int j = i + 1; j < MatrixSize; j++) { if (matrix && matrix[i] > matrix[j]) { Swap(&matrix[i], &matrix[j]); } } } end = clock();//End time execution_time = end - start; return execution_time;//Return the Execution Time } //Selection Sort float SelectionSorted(int* matrix, int MatrixSize) { clock_t start, end; float execution_time; start = clock();//Start time //Main SelectionSort Function for (int i = 0; i < MatrixSize - 1; i++) {//Control the Basic Number int Temp = i;//Store the min number's index for (int j = i + 1; j < MatrixSize; j++) {//Control the Compare Number if ((matrix && matrix[Temp] > matrix[j])) { Temp = j; } } if (i != Temp) {//Direction change the min number with the most left number of this round Swap(&matrix[i], &matrix[Temp]); } } end = clock();//End time execution_time = end - start; return execution_time;//Return the Execution Time } ```