0到n-1数组的排序
来源:互联网 发布:淘宝网店名称大全 编辑:程序博客网 时间:2024/06/04 18:58
仅限 0到n-1这种情况。数组包含n个元素,只不过可能是乱序的,需要排序。
1.检测是否有序:
2.排序。拿起第一个元素k,将其放到p[k]位置,刚才的p[k]元素,也放到他相应的位置上。
#include <iostream>#include <algorithm>#include <iterator>#include <time.h>#include <stdio.h>using namespace std;void sort_n(int *p, int n, int &);void func_test();void time_test();int main() {//1.功能测试cout<<"1.功能测试"<<endl;//func_test();//2.性能测试cout<<"2.性能测试"<<endl;time_test();return 0;}void func_test(){int n = 100;int it = 0;int const N = 40;int x;while(it++ < n){int ar[N];int j;for (j = 0; j< N; j++)ar[j] = j;random_shuffle(ar, ar + N);cout<<it<<endl;cout<<"原始数组:";copy(ar, ar + N, ostream_iterator<int>(cout, " ") );cout<<endl;sort_n(ar, N, x);cout<<"排序数组:";copy(ar, ar + N, ostream_iterator<int>(cout, " ") );cout<<endl;cout<<endl;}}void time_test(){clock_t t1, t2;int N = 10000;int M = 0;int *ap = NULL;int length[] = {1000, 10000, 100000, 1000000};int k = 0;int x = 0;for (k=0; k<4; k++){M = length[k]; // 数组长度ap = new int[M];int s = 0; // 累积时间int i = 0;x = 0;while(i<N){int j;for (j=0; j < M; j++)ap[j] = j; // 构造数组并置乱random_shuffle(ap, ap + M);t1 = clock(); // 排序并计时sort_n(ap, M, x);t2 = clock();s += (t2 - t1);i++;}delete []ap;//cout<<"长度为 "<<M<<" 的数组,循环 "<<N<<" 次 的时间: "<<s<<endl;printf("长度为 %-8d 的数组,循环 %d 次, 耗时: %-4d ms, 复杂度 %d\n", M, N, s, x);}}// 假定输入是合法的,0 ~ n-1 之间的乱序数组 void sort_n(int *p, int n, int &x){ if (p == NULL || n <= 0) return;int tmp1, tmp2; int i;for (i=0; i<n; i++){if (p[i] == i) continue;x++;tmp1 = p[i];p[i] = -1; // 起始的点标记为-1,用于判断是否回到起始点while (p[tmp1] != -1){ // 每遇到一个点,做三件事:1.将该点的值放入tmp1,2.将p[tmp1]暂存到tmp2;3.将p[tmp1]赋值为tmp1. 最后更新tmp1的值进入下次循环x++;tmp2 = p[tmp1];p[tmp1] = tmp1;tmp1 = tmp2;}p[tmp1] = tmp1;}}1.功能测试
2.性能测试
长度为 1000 的数组,循环 10000 次, 耗时: 47 ms, 复杂度 9990184
长度为 10000 的数组,循环 10000 次, 耗时: 528 ms, 复杂度 99990747
长度为 100000 的数组,循环 10000 次, 耗时: 10161 ms, 复杂度 999990558
长度为 1000000 的数组,循环 10000 次, 耗时: 857858 ms, 复杂度 1410055579
PS:看复杂度觉得挺线性的,为什么时间的表现这么。。。
- 0到n-1数组的排序
- 1到n的排序
- 有1,2,3一直到n的无序数组,排序
- 2016魅族校招的一道笔试题,将一个长度为n的数组中存放的是未排序的0到n-1,要求只能将0和其他数swap,完成数组排序
- randperm(N) 产生一个1到N的数组
- 对0到n^3-1区间内的n个整数进行排序
- (p112)在O(n)时间内,对0到n^3-1区间内的n个整数进行排序
- 1到n排序 经典
- 1到N自然数排序
- 有1,2,....一直到n的无序数组,求排序算法,要求时间复杂度为O(n),空间复杂度O(1)
- 有1,2...一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),时间复杂度为O(1)
- 有1,2,....一直到n的无序数组,求排序算法,要求时间复杂度为O(n),空间复杂度O(1)
- 给定一整数 n 产生一个 1 到 n*n的螺旋形数组
- 【算法】选择排序(从小到大) 排序范围(0~n-1) n为数组元素个数
- 【算法】插入排序(从小到大) 排序范围(0~n-1)n为数组元素个数
- 【算法】冒泡排序(从小到大) 排序范围(0~n-1)n为数组元素个数
- 1到n的数组中找出duplicates
- 百度面试题-求1到n个数的排序
- 修改rc.local后,出现循环登录问题
- XML学习笔记
- 情感分析系统的预处理工作
- 链表存储二进制,并且把此二进制数加1
- 9.URl全排序
- 0到n-1数组的排序
- one piece_路飞_01
- 1) 获取类型特征typeTraits [原创,泛型编程,自由下载转载,需注明出处]
- 2013-09-24
- ORALCE基于用户管理恢复的处理
- OCP-1Z0-053-V12.02-316题
- 工作那些事(七)选择与被选择
- LCD1602说明以及初始设置
- RMAN备份、监控与管理