diff --git a/README.md b/README.md index f635bc8..519abfd 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,193 @@ -# Htu +一、/*冒泡排序*/ +平均时间复杂度:0(n^2) +运行时间:1000随机数:时间为0.003s + 1万随机数:时间为0.57s + 10万随机数:时间为40.224s +void BubbleSort(int arr[], int length) +{ + for (int i = 0; i < length; i++) + { + for (int j = 0; j < length - i - 1; j++) + { + if (arr[j] > arr[j + 1]) + { + int temp; + temp = arr[j + 1]; + arr[j + 1] = arr[j]; + arr[j] = temp; + } + } + } +} +二、/* 选择排序 */ +平均时间复杂度:0(n^2) +运行时间:1000随机数:时间为:0.004s + 1万随机数:时间为:0.225s + 10万随机数:时间为:34.125s +void SelectionSort(int arr[], int length) +{ + int index, temp; + for (int i = 0; i < length; i++) + { + index = i; + for (int j = i + 1; j < length; j++) + { + if (arr[j] < arr[index]) + index = j; + } + if (index != i) + { + temp = arr[i]; + arr[i] = arr[index]; + arr[index] = temp; + } + } +} +三、/*插入排序*/ +平均时间复杂度:0(n^2) +运行时间:1000个随机数:时间为:0.003s + 1万个随机数:时间为:0.195s + 10万个随机数:时间为:21.671s +void InsertSort(int arr[], int length) +{ + for (int i = 1; i < length; i++) + { + int j; + if (arr[i] < arr[i - 1]) + { + int temp = arr[i]; + for (j = i - 1; j >= 0 && temp < arr[j]; j--) + { + arr[j + 1] = arr[j]; + } + arr[j + 1] = temp; + } + } +} +四、/*归并排序*/ +平均时间复杂度:0(n*log2n) +运行时间:1000随机数:时间为0.001s + 1万随机数:时间为0.049s + 10万随机数:时间为6.908s +void MergeSort(int arr[], int start, int end, int * temp) +{ + if (start >= end) + return; + int mid = (start + end) / 2; + MergeSort(arr, start, mid, temp); + MergeSort(arr, mid + 1, end, temp); + int length = 0; + int i_start = start; + int i_end = mid; + int j_start = mid + 1; + int j_end = end; + while (i_start <= i_end && j_start <= j_end) + { + if (arr[i_start] < arr[j_start]) + { + temp[length] = arr[i_start]; + length++; + i_start++; + } + else + { + temp[length] = arr[j_start]; + length++; + j_start++; + } + } + while (i_start <= i_end) + { + temp[length] = arr[i_start]; + i_start++; + length++; + } + while (j_start <= j_end) + { + temp[length] = arr[j_start]; + length++; + j_start++; + } + for (int i = 0; i < length; i++) + { + arr[start + i] = temp[i]; + } +} +五、/*快速排序*/ +平均时间复杂度:0(n*log2n) +运行速度:1000随机数:时间为0.001s + 1万随机数:时间为0.005s + 10万随机数:时间为0.139s +void QuickSort(int arr[], int start, int end) +{ + if (start >= end) + return; + int i = start; + int j = end; + int baseval = arr[start]; + while (i < j) + { + while (i < j && arr[j] >= baseval) + { + j--; + } + if (i < j) + { + arr[i] = arr[j]; + i++; + } + while (i < j && arr[i] < baseval) + { + i++; + } + if (i < j) + { + arr[j] = arr[i]; + j--; + } + } + arr[i] = baseval; + QuickSort(arr, start, i - 1); + QuickSort(arr, i + 1, end); +} +六、/*希尔排序*/ +平均时间复杂度:0(n^1.3) +运行速度:1000随机数:时间为:0.001s + 1万随机数:时间为:0.051s + 10万随机数:时间为:5.253s +void ShellSort(int arr[], int length) +{ + int increasement = length; + int i, j, k; + do + { + increasement = increasement / 3 + 1; + for (i = 0; i < increasement; i++) + { + for (j = i + increasement; j < length; j += increasement) + { + if (arr[j] < arr[j - increasement]) + { + int temp = arr[j]; + for (k = j - increasement; k >= 0 && temp < arr[k]; k -= increasement) + { + arr[k + increasement] = arr[k]; + } + arr[k + increasement] = temp; + } + } + } + } while (increasement > 1); +} +比较总结: +1.对1000个随机数进行排序: +六种排序算法的所需时间均接近0.001s,速度都很快。 +2.对1万个随机数进行排序: +快速0.005s < 希尔0.051s < 归并0.049s < 插入0.195s < 选择0.225s < 冒泡0.57s +很明显,快速排序法最快,冒泡排序法最慢。 +3.对10万个随机数进行排序: +快速0.139s < 希尔5.253s < 归并6.908s < 插入21.671s < 选择34.125s < 冒泡40.224s +快速排序法最快,冒泡排序法最慢。 +4.对100万个随机数进行排序: +快速10.624s,其余算法时间未知,几分钟内排序无法完成。