[算法]_[对数组内的数字进行从小到大排序]
2013-01-24 11:02
190 查看
场景:
1.有时候需要把集合或数组里的数据排序后展现出来时.
2.由于有些数据结构处理需要先对数组进行排序才能进行时.
文件: test_sort.cpp
输出,执行了4次,可见插入排序的确不怎么地:
1.有时候需要把集合或数组里的数据排序后展现出来时.
2.由于有些数据结构处理需要先对数组进行排序才能进行时.
文件: test_sort.cpp
#include <stdio.h> #include <algorithm> #include <stdlib.h> #include <iostream> #include <time.h> #include <assert.h> #include <vector> #include <windows.h> using namespace std; void InsertSort(vector<int>& array,size_t length) { int key = 0; for(size_t j=1;j<length;++j) { int i = j-1; key = array[j]; while(i>=0 && array[i] > key) { array[i+1] = array[i]; --i; } array[i+1] = key; } } bool cmp(int a,int b) { return a<b; } inline int Partition(int array[],int p,int r) { int value = array[p]; int i = p; int j = r+1; int temp = 0; do { do { ++i; if(i > r) { break; } } while(array[i]<value);//1.直到找到比它大的元素索引. do { --j; } while(array[j]>value); if(i < j) { temp = array[j]; array[j] = array[i]; array[i] = temp; } }while(i < j); array[p] = array[j]; array[j] = value; return j; } void QuickSort(int array[],int p,int r) { if(p<r) { int j = Partition(array,p,r); QuickSort(array,p,j-1); QuickSort(array,j+1,r); } } inline int PartitionSlow(int array[],int p,int r) { int x = array[r]; int i = p -1; int r1 = r-1; int temp = 0; //1.这里始终要把比它小的元素往前移动,是慢的原因 //2.交换元素值是非常耗时的.swap //3.比它小的尽量原地不动会更好,减少交换次数. for(int j = p;j <= r1;++j) { if(array[j]<x) { ++i; temp = array[j]; array[j] = array[i]; array[i] = temp; } } array[r] = array[i+1]; array[i+1] = x; return i+1; } //缺点:对于有序数组,耗时比较长(稳定性不够好) void QuickSortSlow(int array[],int p,int r) { if(p<r) { int j = PartitionSlow(array,p,r); QuickSortSlow(array,p,j-1); QuickSortSlow(array,j+1,r); } } int main(int argc, char *argv[]) { printf("Hello, world\n"); //RAND_MAX srand(time(NULL)); const int kMaxNum = 100000; vector<int> v1(kMaxNum,0); for(int i=0;i<kMaxNum;++i) { v1[i] = rand()%100; } vector<int> v2(v1); //这个在windows下是毫秒级别. //1.使用库函数排序. cout << CLOCKS_PER_SEC << endl; double time=clock(); sort(v1.begin(),v1.end(),cmp); double Inteval = clock()-time; cout << "排序耗时 单位(毫秒): " << Inteval << endl; //1.验证排序. int pre = v1[0]; for(int i=0;i<kMaxNum;++i) { assert(v1[i] >= pre); pre = v1[i]; } //2.使用自己的排序算法. size_t length = v2.size(); time=clock(); InsertSort(v2,length); Inteval = clock()-time; cout << "插入排序耗时 单位(毫秒): " << Inteval << endl; pre = v1[0]; for(int i=0;i<kMaxNum;++i) { assert(v1[i] >= pre); pre = v1[i]; } int array[kMaxNum]; for(int i=0;i<kMaxNum;++i) { array[i] = rand()%100; } // int array_bug1[] = {4,3,1}; // int array_bug2[] = {1,3,4}; time=clock(); QuickSort(array,0,kMaxNum-1); Inteval = clock()-time; cout << "快速排序优化耗时 单位(毫秒): " << Inteval << endl; pre = array[0]; for(int i=0;i<kMaxNum;++i) { assert(array[i] >= pre); pre = array[i]; } for(int i=0;i<kMaxNum;++i) { array[i] = rand()%100; } time=clock(); QuickSortSlow(array,0,kMaxNum - 1); Inteval = clock()-time; cout << "快速排序(算法导论)耗时 单位(毫秒): " << Inteval << endl; pre = array[0]; for(int i=0;i<kMaxNum;++i) { assert(array[i] >= pre); pre = array[i]; } return 0; }
输出,执行了4次,可见插入排序的确不怎么地:
C:\workspace\script-test\test_sort>test_sort Hello, world 1000 排序耗时 单位(毫秒): 56 插入排序耗时 单位(毫秒): 0 快速排序优化耗时 单位(毫秒): 10 快速排序(算法导论)耗时 单位(毫秒): 161 C:\workspace\script-test\test_sort>test_sort Hello, world 1000 排序耗时 单位(毫秒): 50 插入排序耗时 单位(毫秒): 26774 快速排序优化耗时 单位(毫秒): 12 快速排序(算法导论)耗时 单位(毫秒): 167 C:\workspace\script-test\test_sort>test_sort Hello, world 1000 排序耗时 单位(毫秒): 63 插入排序耗时 单位(毫秒): 25666 快速排序优化耗时 单位(毫秒): 10 快速排序(算法导论)耗时 单位(毫秒): 161
相关文章推荐
- [算法]_[对数组内的数字进行从小到大排序]
- 在数组中插入数字,并从小到大进行排序(初学小记)
- 求出所有这些四位数是素数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b中的四位数按从小到大的顺序进行排序
- 程序员面试题精选100题(10)-排序数组中和为给定值的两个数字[算法]
- 那些年我们刷过的算法题(排序)---有一个只由0,1,2三种元素构成的整数数组,请使用交换、原地排序而不是使用计数进行排序
- 数据结构——算法之(005)(输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字)
- 使用sort()函数对数组中的数字进行排序。
- 对数组里的字典进行数字字母排序
- (算法:二分查找)在排序数组中,找出给定数字出现的次数
- 有一串字符串a12hh123mm21m78 ,请将其中的数字提取出来存入数组,使用选择排序算法将其进行排序:
- 一个返回json对象的问题 key 为数字时 会默认从小到大进行排序
- 用插入排序和归并排序算法对数组<3,1,4,1,5,9,6,5>进行从小到大排序,则分别需要进行______次数组元素之间的比较。
- 算法复习:数字在排序数组中出现的次数
- js数组排序,根据数组中对象的某一属性进行排序 支持数字和字符串的排序,也支持按两个属性进行排序
- js对数组中的数字从小到大排序
- 利用随机类生成数组,并用冒泡排序以及选择排序对不同数组的元素进行从小到大的排序
- 一个字符数组,里面的字符可能是a-z、A-Z、0-9.现在要求对数组进行排序,要求所有小写字符放在最前面,所有大写字符放在中间,所有数字放在最后,而且各部分内部分别有序(创新工场)
- 个有10个元素的整型一维数组,用户输入9个数据,调用函数,对数组元素进行从小到大排序后,在函数中输入一个数,插入到数组中正确的位置,并输出
- js对数组中的数字从小到大排序实现代码
- 一个一维整形数组,若干个数字,统计数组中不同的数字出现的次数,并按照出现频率从小到大排序输出,相同频率按数字大小排序输出