常见排序总结
来源:互联网 发布:手机淘宝改评价 编辑:程序博客网 时间:2024/06/05 23:36
各算法的时间复杂度
①平均时间复杂度
插入排序 O(n^2),冒泡排序 O(n^2),选择排序 O(n^2),快速排序 O(n log n)
堆排序 O(n log n),归并排序 O(n log n),基数排序 O(n),希尔排序 O(n^1.25)
②算法稳定性
选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法;
冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
一、 冒泡法排序
- void BubbleSort(int *v, const int len)
- {
- int i, j, temp;
- for(i = 0; i < len - 1; ++ i)
- {
- for(j = 0; j < len - i - 1; ++ j)
- {
- if(v[j] > v[j + 1])
- {
- temp = v[j];
- v[j] = v[j + 1];
- v[j + 1] = temp;
- }
- }
- }
- }
二 、选择法排序
1) 普通方法
- void SelectSort(int *v, const int len)
- {
- int i,j,temp;
- for(i = 0; i < len - 1; ++ i)
- {
- for(j = i + 1; j < len ; ++ j)
- {
- if(v[i] > v[j])
- {
- temp = v[i];
- v[i] = v[j];
- v[j] = temp;
- }
- }
- }
- }
2) 优化方法
- void SelectSort(int *v, const int len)
- {
- int i,j,k,temp;
- for(i = 0; i < len - 1; ++ i)
- {
- k = i;
- for(j = i + 1; j < len; ++ j)
- {
- if(v[k] > v[j])
- {
- k = j;
- }
- }
- if(k != i)
- {
- temp = v[i];
- v[i] = v[k];
- v[k] = temp;
- //v[i] ^= v[k] ^= v[i] ^= v[k];
- }
- }
- }
三、快速排序,快排最标准的递归实现,速度约是std::sort的一半
- #include <stdio.h>
- int Partition(int *iArray, int i, int j)
- {
- int pivot = iArray[ i ];
- while(i < j)
- {
- while(i < j && iArray[ j ] >= pivot )
- {
- j --;
- }
- if(i < j)
- {
- iArray[ i ++ ] = iArray[ j ];
- }
- while(i < j && iArray[ i ] <= pivot)
- {
- i ++;
- }
- if(i < j)
- {
- iArray[ j -- ] = iArray[ i ];
- }
- }
- iArray[ i ] = pivot;
- return i;
- }
- void QuickSort(int *iArray, int low, int high)
- {
- if(low < high)
- {
- int pivotpos = Partition(iArray, low, high);
- QuickSort(iArray, low, pivotpos - 1);
- QuickSort(iArray, pivotpos + 1, high);
- }
- }
- int main()
- {
- int iArray[] = {1,0,9,3,7,2,-90,78,45,4,77,79,78,37,0,-1,2,3,6,9,5,4,78,78,78,1,1,1};
- int len = sizeof(iArray) / sizeof(int);
- QuickSort(iArray, 0, len - 1);
- for(int i = 0; i < len; ++ i)
- {
- printf("%3d ",iArray[ i ]);
- }
- printf("\n");
- }
四、直接插入排序
直接插入排序(straight insertion sort)的作法是:
1. 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
2. 直接插入排序属于稳定的排序,最坏时间复杂性为O(n^2),空间复杂度为O(1)。
直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
3. 值得注意的是,我们必需用一个存储空间来保存当前待比较的数值,因为当一趟比较完成时,我们要将待比较数值置入比它小的数值的后一位 插入排序类似玩牌时整理手中纸牌的过程。插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止。
- void InsertSort(int *v, const int len)
- {
- int i,j,temp;
- for(i = 1; i < len; ++ i)
- {
- //store the original sorted array in temp
- temp = v[i];
- //compare the new array with temp(maybe -1?)
- for(j = i ; j > 0 && temp < v[j - 1] ; -- j)
- {
- //all larger elements are moved one pot to the right
- v[j] = v[j - 1];
- }
- //此时的j已经是空位的j
- v[j] = temp;
- }
- }
五、归并排序,效率越是std::sort的六分之一,通常的实现是递归,但和快排不同,归并改循环极其容易
- void Merge(int *v, int low, int mid, int high)
- {
- int i = low, j = mid + 1, k = low;
- int *tempV = new int [high + 1];
- while(i <= mid && j <= high)
- {
- // 此处为排序顺序的关键,用小于表示从小到大排序
- if(v[i] <= v[j])
- {
- tempV[k++] = v[i++];
- }
- else
- {
- tempV[k++] = v[j++];
- }
- }
- while(i <= mid)
- {
- tempV[k++] = v[i++];
- }
- while(j <= high)
- {
- tempV[k++] = v[j++];
- }
- // 写回原数组
- for(i = low; i <= high; i++)
- {
- v[i] = tempV[i];
- }
- delete [] tempV;
- }
- void GetMergeSort(int *v, int low, int high)
- {
- int mid;
- if(low < high)
- {
- mid = low + (high - low) / 2;
- GetMergeSort(v, low, mid);
- GetMergeSort(v, mid + 1, high);
- Merge(v, low, mid, high);
- }
- }
- void MergeSort(int *v, const int len)
- {
- GetMergeSort(v, 0, len - 1);
- }
- 常见排序总结
- 常见排序总结
- 常见排序算法总结
- 常见排序总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结 .
- 常见排序总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序总结
- java 文件路径
- php扩展的用到的一些宏
- mysql :left join语句优化
- 安装Aptana插件到eclipse
- Mailbox:六星期实现从零到百万用户及日处理亿条消息
- 常见排序总结
- Linux的vsftp使用默认root用户上传文件
- 推荐几个免费的国外图像库,数字图像处理必备
- JS 获取项目路径
- 如何打造测试工程师精英团队?
- SQL Server 创建视图
- 关于freemarker include文件路径的问题
- Math.Round四舍六入五成双和double.tostring()的用法
- 2d-x 拷贝机制