排序算法的代码整理
来源:互联网 发布:sql server 2008服务器 编辑:程序博客网 时间:2024/05/22 15:34
代码使用vs2010编写,并编译运行成功,参考资料:《数据结构(C语言)》
目前只有:直接插入排序、希尔排序、冒泡排序、快速排序
这里只有代码,分析可以参照博文:排序算法的学习笔记
以下为代码:
SortTest1.h
#include <iostream>void InsertSort(int L[], int Lsize){//直接插入排序O(n^2)//L[0]为哨兵,不包含在序列中for(int i=2;i <= Lsize; ++i){//i=2;从序列的第二个数开始if(L[i] < L[i-1]){//找到不满足升序的一个数L[0] = L[i]; //将该数保存下来L[i] = L[i-1]; //将前一个数向后移动一位【这个操作可以忽略,此时j=i-1;】int j=i-2; //上述操作已经将i的前一位后移,所以从i的前第2位开始for(;L[0]<L[j]; --j){//从j开始,找到i大于那个数为止,也就是找到插入的位置//后移所有数L[j+1] = L[j];}//j+1的位置为要插入的位置L[j+1] = L[0];}}}void ShellInsert(int L[], int Lsize, int dk){//一次希尔排序//与上面的直接插入排序做比较,前后记录增量是dk,而不是1;L[0]知识暂存单元int i = dk+1;//不再是从第二个数开始,而是从相对于当前增量的第二个数开始for(; i<=Lsize; ++i){//往后遍历,是 ++i 而不是 i+=dk,因为要遍历整个序列if(L[i] < L[i-dk]){//相对于当前增量,与前一个数比较L[0] = L[i]; //暂时保存int j = i - dk; //j不再是i-1,原因在增量for(; (j > 0) && (L[0] < L[j]); j-=dk){//j-=dk;原因在增量。当j小于0时,插入位置已经找到//记录后移,增量的影响L[j+dk] = L[j];}//位置则是j+dkL[j+dk] = L[0];}}}void ShellSort(int L[],int Lsize){//根据增量序列,调用排序//希尔排序,最坏的情况O(n^1.3)int dlta[4] = {7,5,3,1};for(int k=0; k < 4; ++k){ShellInsert(L,Lsize,dlta[k]);}}void BubbleSort(int L[],int Lsize){//冒泡排序,最坏O(n^2),最好O(n)【最好很难出现】bool exChange = true;//如果没有发生交换,那么便可以停止遍历了for(int t = 1; exChange && t<=Lsize;t++){//t可以看作做是第t次冒泡,第t次冒泡的最小值放在第t位exChange = false;for(int i=Lsize; i>=t; --i){//每次都从序列的最后开始,一直到每次的顶部if(L[i] < L[i-1]){//发生交换exChange = true;//每次都上升较小的值L[0] = L[i];L[i] = L[i-1];L[i-1] = L[0];}}}}int Partition(int L[], int low, int high){//快速排序的某一次int pKey = L[low];//以子序列的low位置为标准while(low < high){//如果low=high,则表示找到了pKey的位置while(low<high && L[high] >= pKey) //确保low<high,且high的位置都应该不小于pKeyhigh--; //high前移,直到找到不大于pKey的位置L[0] = L[high]; //将找到的位置与low交换,L[high] = L[low];L[low] = L[0];while(low<high && L[low] <= pKey) //然后从low开始找,确保low<high,且low的位置都应该不大于pKeylow++; //low后移,直到找到不小于pKey的位置L[0] = L[high]; //同上交换L[high] = L[low];L[low] = L[0];}//low与high相等,都为找到的pKey的位置return low;}void QSort(int L[], int low, int high){//快速排序的递归部分if(low < high){//满足low<high前提下//找到low【即pKey】的位置int pLoc = Partition(L,low,high);//然后根据这个位置,将子序列分成两段去排序//子序列 low …… high//两段 low … ploc … highQSort(L,low,pLoc - 1);QSort(L,pLoc + 1,high);}}void QuickSort(int L[],int Lsize){//快速排序,目前被认为是最好的一种内部排序方法//O(nlogn)QSort(L,1,Lsize);}
main.cpp
#include <iostream>#include "SortTest1.h"int a[9] = {0,49,38,65,97,76,13,27,49};int sizeOfa = 8;void PrintArray(){std::cout << "数组为:";for(int a_i=1; a_i <= sizeOfa; a_i++){std::cout << a[a_i] << " ";}std::cout << std::endl;}void sortArray(){//InsertSort(a,sizeOfa);//直接插入排序//ShellSort(a,sizeOfa);//希尔排序//BubbleSort(a,sizeOfa);//冒泡排序QuickSort(a,sizeOfa);//快速排序PrintArray();}int main(){sortArray();return 0;}
0 0
- 排序算法的代码整理
- 排序算法代码整理
- java的各种排序算法代码整理
- 常见排序算法代码整理
- 常用排序算法代码整理
- 数据结构排序算法及代码整理
- 排序算法整理-带C代码
- 排序算法的比较整理
- 整理的排序算法总结
- 常用的排序算法整理
- 整理的常见排序算法
- 排序算法的代码
- 各种常用的排序算法实现对数组的排序——整理总结(代码实现)
- 自己整理的快速排序算法
- 排序算法的整理(1)
- 8种排序算法的整理
- 数据结构中几种排序算法的整理
- 简单的排序算法整理(一)
- Mms彩信添加联系人和日历时,时间格式与系统时间格式不相符的问题
- 友善之臂の用自己的qt4.7程序替换掉友善之臂的start qt4.7.0
- StringMethodDemo.java
- Android 自动适应字体大小的EditText
- unique函数
- 排序算法的代码整理
- Fragment实例,数据存储,数据库SQLite
- Qt 头文件、CONFIG
- Firing (poj 2987 最大权闭合图)
- 周赛一 ACdream 1199 排列组合
- Hibernate使用之快速开始
- 十个人过洞
- ERROR: HHH000388: Unsuccessful: create table right (right_code varchar(255) not null auto_increment,
- java cpu占用过高分析