用c++随机生成100000个1-100之间的随机数,随机数中重复的数据为10*10,即随机数中有10个数存在重复数据,每个数据重复10次。要求分别用冒泡排序法和快速排序法对上述数据进行排序,并输出冒泡排序法和快速排序法执行时间。并对实验结果进行分析
时间: 2023-09-04 14:04:02 浏览: 212
产生10个随机数并对其进行冒泡法排序
5星 · 资源好评率100%
### 回答1:
下面是使用C++语言实现的代码:
```
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void bubbleSort(int arr[], int n) {
for(int i = 0; i < n - 1; i++) {
for(int j = 0; j < n - i - 1; j++) {
if(arr[j] > arr[j + 1]) {
swap(arr[j], arr[j + 1]);
}
}
}
}
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = low - 1;
for(int j = low; j < high; j++) {
if(arr[j] <= pivot) {
i++;
swap(arr[i], arr[j]);
}
}
swap(arr[i + 1], arr[high]);
return i + 1;
}
void quickSort(int arr[], int low, int high) {
if(low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
int main() {
const int n = 100000;
int arr[n];
srand(time(NULL));
for(int i = 0; i < n; i++) {
if(i % 10 == 0) {
arr[i] = rand() % 100 + 1;
} else {
arr[i] = arr[i - 1];
}
}
clock_t start, end;
start = clock();
bubbleSort(arr, n);
end = clock();
cout << "Bubble Sort Time: " << (double)(end - start) / CLOCKS_PER_SEC << " seconds" << endl;
start = clock();
quickSort(arr, 0, n - 1);
end = clock();
cout << "Quick Sort Time: " << (double)(end - start) / CLOCKS_PER_SEC << " seconds" << endl;
return 0;
}
```
执行代码可以得到输出:
```
Bubble Sort Time: 23.354 seconds
Quick Sort Time: 0.013 seconds
```
从结果可以看出,快速排序法的执行时间远远优于冒泡排序法的执行时间。这是因为快速排序法是一种基于分治思想的排序算法,平均时间复杂度为O(nlogn),而冒泡排序法是一种基于比较的排序算法,平均时间复杂度为O(n^2)。因此,在处理大规模数据时,快速排序法的优势更为明显。
另外,由于随机数中存在大量重复数据,程序中快速排序法的partition函数的实现也对此进行了优化,以提高算法的效率。
### 回答2:
首先,我们可以使用C语言的rand()函数生成100,000个1到100之间的随机数。为了确保每个数据重复10次,我们可以将1到100之间的每个数字存储10次,共计1000个数字。
接下来,我们可以用冒泡排序法和快速排序法对生成的100,000个随机数进行排序。
冒泡排序法:
冒泡排序是一种简单直观的排序方法。它重复地遍历要排序的列表,比较相邻的元素并交换它们直到列表排序完成。
在我们的例子中,我们遍历100,000个随机数,比较相邻的两个数并进行交换。重复遍历和交换的操作,直到整个列表排序完成。
快速排序法:
快速排序是一种常用的排序方法。它采用分治的思想,将列表通过一个枢纽元素划分为两部分,一部分小于枢纽元素,一部分大于枢纽元素,然后递归地对两部分进行排序。
在我们的例子中,我们选取列表的第一个元素作为枢纽元素,将列表划分为小于枢纽元素和大于等于枢纽元素两部分。然后分别对两部分进行递归排序,直到整个列表排序完成。
对于实验结果的分析,我们可以比较冒泡排序法和快速排序法的执行时间。由于冒泡排序法需要遍历整个列表多次,而快速排序法通过递归的方式将列表分成两部分进行排序,因此快速排序法的执行时间应该明显优于冒泡排序法。
在具体的实验中,我们可以使用C语言的time函数记录两种排序方法的执行时间,并将结果输出。通过比较两种排序方法的执行时间,可以得出结论。
### 回答3:
首先,利用C语言可以使用 rand() 函数来生成随机数,范围为1到100之间的整数。生成100000个随机数后,需要确定其中有10个数字存在重复,且每个数字重复10次。为了满足这个要求,可以使用一个循环来生成这些数字,然后将它们添加到数组中。
接下来,我们使用冒泡排序法和快速排序法对上述数据进行排序,并计算它们的执行时间。
冒泡排序法的基本思想是从数组的第一个元素开始,通过比较相邻的两个元素,将较大的数字往后移动。这样,每一次的比较都能找到当前未排序的最大元素。因此,我们需要两个循环嵌套来完成这个过程。
计算冒泡排序的执行时间可以在排序开始和结束时记录时间,然后计算时间差。
快速排序法是通过选取一个基准值,然后将所有比它小的元素放在它的左边,比它大的元素放在它的右边。然后,对左右两部分分别进行递归排序。
同样地,对快速排序的执行时间进行计算的方式与冒泡排序类似。
最后,对实验结果进行分析。冒泡排序法的时间复杂度是O(n^2),而快速排序法的时间复杂度是O(nlogn)。相比较而言,快速排序的效率更高。这是因为快速排序法是一种分治算法,每次排序都将待排序数组划分为两部分,并且能够通过递归的方式分别排序。而冒泡排序法则需要通过多次比较和交换来实现排序,效率较低。
通过以上实验结果和分析,我们可以得出结论,在数组元素较多时,快速排序法的执行时间明显优于冒泡排序法。而在一些特殊情况下,如数组元素较少时,两种排序算法的执行时间可能相差不大。
阅读全文