#include <iostream> using namespace std; #include <stdlib.h> #include <time.h> #include <windows.h> //简单选择排序 void main() { int *arr=new int[200000]; for (int i = 1; i < 200000; i++) { arr[i] = i; }//初始化数组 //打乱数组 int index, tmp; srand(time(NULL)); for (int i = 1; i < 200000; i++) { index = rand() % (200000 - i) + i; if (index != i) { tmp = arr[i]; arr[i] = arr[index]; arr[index] = tmp; } } //记录时间 LARGE_INTEGER begin, end; QueryPerformanceCounter(&begin); //简单选择排序 for (int i = 1; i < 199999; i++) { int index = i; for (int j = i + 1; j <= 199999; j++) { if (arr[j] < arr[index])//如果第j个小于第i个则将索引交换 index = j; if (index != i)//索引不等于i就,即上面if语句执行,则进行交换 { int temp = arr[i]; arr[i] = arr[index]; arr[index] = temp; } } } QueryPerformanceCounter(&end); cout << "花费了:" << end.QuadPart - begin.QuadPart << "时钟周期" << endl; cout << endl; }优化代码
时间: 2024-04-04 22:32:25 浏览: 77
这段代码主要是实现了一个简单选择排序,并且对一个长度为200000的数组进行了排序。不过在实现上还有一些可以优化的地方,比如数组的初始化可以使用memset函数来代替for循环,以及排序过程中可以使用引用或指针来进行交换操作,避免不必要的拷贝。另外,建议将代码整理成更规范、易读的形式,比如添加注释、缩进、空行等。
相关问题
c语言编译最大子段和问题,#include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std;
C语言编译最大子段和问题是一个经典的算法问题,也被称为最大子数组和问题。该问题的目标是在一个给定的整数数组中,找到一个连续的子数组,使得该子数组的元素之和最大。
解决这个问题的一种常见方法是使用动态规划。具体步骤如下:
1. 定义两个变量:max_sum用于保存当前最大子段和,cur_sum用于保存当前子段和。
2. 遍历整个数组,对于每个元素,将其加到cur_sum中。
3. 如果cur_sum大于max_sum,则更新max_sum为cur_sum。
4. 如果cur_sum小于0,则将cur_sum重置为0,重新开始计算子段和。
5. 遍历完成后,max_sum即为最大子段和。
下面是一个示例代码:
```c
#include <stdio.h>
int maxSubArraySum(int arr[], int n) {
int max_sum = arr;
int cur_sum = arr;
for (int i = 1; i < n; i++) {
cur_sum = (cur_sum + arr[i] > arr[i]) ? cur_sum + arr[i] : arr[i];
max_sum = (cur_sum > max_sum) ? cur_sum : max_sum;
}
return max_sum;
}
int main() {
int arr[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int n = sizeof(arr) / sizeof(arr);
int max_sum = maxSubArraySum(arr, n);
printf("最大子段和为:%d\n", max_sum);
return 0;
}
```
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<limits.h> #include<iostream> using namespace std; #includeMGraph.h void Dijkstra(MGraph g,int v); //求从v到其他顶点的最短路径 vo
我注意到你给出的代码不完整,无法运行,但是根据代码的大致结构,我可以解答你的问题。
这段代码是实现Dijkstra算法求最短路径的。Dijkstra算法是一种贪心算法,用于求解带权图中单源最短路径。具体实现过程如下:
1. 初始化:将起始点v加入已确定最短路径的集合S,将所有其他点加入未确定最短路径的集合Q。将v到其他点的距离初始化为无穷大,v到自己的距离初始化为0。
2. 迭代:在Q中选择一个距离v最近的点u,将u加入S中,并更新Q中所有点到v的距离,如果通过u可以使得某个点的距离更短,则更新该点的距离。
3. 重复执行第2步,直到所有点都被加入S中。
在代码实现中,Dijkstra函数的参数g是一个带权图,v是起点。函数中使用了一个distance数组来存储v到每个点的距离,一个s数组来表示该点是否已经被加入S中。函数中的for循环用于初始化数组,while循环用于迭代过程。在每次迭代中,通过一个min函数来找到距离v最近的点u,并将其加入S中。然后通过一个for循环来更新Q中所有点到v的距离。最后输出distance数组即可。
需要注意的是,该算法只适用于无负权边的图,如果存在负权边,则可能会导致算法失效。
阅读全文