[C++]数据结构实验02:冒泡、插入、基数三种排序算法
2012-11-21 21:24
429 查看
/**********************************************************************************************/ /* 实验二:排序算法 /* 1.输入2-10个不为零的正整数,遇到0,代表输入结束。 /* 2.数字选择排序方法,1-冒泡排序,2-插入排序,3-基数排序。 /* 3.使用所选排序方法的排序,结果输出所用方法以及结果, /* 每个数之间用","隔开,中间不要有空格。 /* 4.输入输出请严格按下面要求的格式实现 /**********************************************************************************************/ #include <iostream> using namespace std; template <class T> void BubbleSort(T& nData,int len) { bool isOk = false; for(int i = 0;i<len-1&&!isOk;++i){ isOk = true; for(int j = len - 1;j > i;--j){ if(nData[j]<nData[j-1]){ int temp = nData[j]; nData[j] = nData[j-1]; nData[j-1] = temp; isOk = false; } } } } template <class T> void InsertSort(T& array, int length){ int i, j, key; for (i = 1; i < length; i++){ key = array[i]; //把i之前大于array[i]的数据向后移动 for (j = i - 1; j >= 0 && array[j] > key; j--){ array[j + 1] = array[j]; } //在合适位置安放当前元素 array[j + 1] = key; } } int RadixCountSort(int* npIndex, int nMax, int* npData, int nLen){ //这里就不用说了,计数的排序。不过这里为了是排序稳定 //在标准的方法上做了小修改。 int* pnCount = (int*)malloc(sizeof(int)* nMax); //保存计数的个数 int i = 0; for (i = 0; i < nMax; ++i){ pnCount[i] = 0; } for (i = 0; i < nLen; ++i){ //初始化计数个数 ++pnCount[npIndex[i]]; } for (i = 1; i < 10; ++i){ //确定不大于该位置的个数。 pnCount[i] += pnCount[i - 1]; } int * pnSort = (int*)malloc(sizeof(int) * nLen); //存放零时的排序结果。 //注意:这里i是从nLen-1到0的顺序排序的,是为了使排序稳定。 for (i = nLen - 1; i >= 0; --i){ --pnCount[npIndex[i]]; pnSort[pnCount[npIndex[i]]] = npData[i]; } for (i = 0; i < nLen; ++i){ //把排序结构输入到返回的数据中。 npData[i] = pnSort[i]; } free(pnSort); //记得释放资源。 free(pnCount); return 1; } //基数排序 int RadixSort(int* nPData, int nLen){ //申请存放基数的空间 int* nDataRadix = (int*)malloc(sizeof(int) * nLen); int nRadixBase = 1; //初始化倍数基数为1 int nIsOk = 0; //设置完成排序为0 //循环,知道排序完成 while (!nIsOk){ nIsOk = 1; nRadixBase *= 10; int i = 0; for (i = 0; i < nLen; ++i){ nDataRadix[i] = nPData[i] % nRadixBase; nDataRadix[i] /= nRadixBase / 10; if (nDataRadix[i] > 0){ nIsOk = 0; } } if (nIsOk){ //如果所有的基数都为0,认为排序完成,就是已经判断到最高位了。 break; } RadixCountSort(nDataRadix, 10, nPData, nLen); } free(nDataRadix); return 1; } template <class T> void show(T arr,int n){ for(int i =0;i<n-1;i++){ cout<<arr[i]<<","; } cout<<arr[n-1]<<endl; } template <class T> void change(T arr,int n) { arr[0]=2; arr[1]=2; show(arr,n); } void main() { int inputNumber[10]; int count = 0; cout<<"Input"<<endl; for(int i =0;i<10;i++){ int a; cin>>a; if(a==0){ break; } inputNumber[i]=a; count++; } cout<<"1-冒泡排序、2-插入排序、3-基数排序"<<endl; cout<<"Output"<<endl; int choice; cin>>choice; switch(choice){ case 1: cout<<"冒泡排序"<<endl; BubbleSort(inputNumber,count); show(inputNumber,count); break; case 2: cout<<"插入排序"<<endl; InsertSort(inputNumber,count); show(inputNumber,count); break; case 3: cout<<"基数排序"<<endl; RadixSort(inputNumber,count); show(inputNumber,count); break; default: break; } cout<<"End"<<endl; }
相关文章推荐
- C++ 一个程序兼容冒泡、插入、基数三种排序算法
- 数据结构与算法 4:排序算法,选择/插入/冒泡/希尔/快速/归并
- C++_排序算法--冒泡、插入、归并、快速、堆、基数、桶、计数
- 插入算法 二分搜索 读数据结构与算法-C++
- 数据结构之排序(冒泡,选择,插入,快排)
- 数据结构(四)常用排序算法-选择、插入、希尔
- 从零开始_学_数据结构(六)——排序(冒泡、插入、希尔、简单选择、归并、快速)
- 数据结构——算法之(043)(c++各种排序算法实现)
- 10种排序算法总结(冒泡、选择、插入、希尔、归并、快速、堆、拓扑、锦标赛、基数)
- 数据结构之排序大集合(上)(冒泡、插入、希尔、快排)
- 数据结构之头指针链表de三种插入方式(头插法,尾插法,在pos处插入)
- C++ 排序算法(1)---冒泡,选择,插入
- 10种排序算法总结(冒泡、选择、插入、希尔、归并、快速、堆、拓扑、锦标赛、基数)
- Java三种常见的排序算法:冒泡,选择,插入
- 【数据结构】——排序算法——1.1、直接插入排序
- 数据结构之排序大集合(上)(冒泡、插入、希尔、快排)
- 数据结构图文解析之:直接插入排序及其优化(二分插入排序)解析及C++实现
- 八种排序算法(直接插入,希尔,直接选择,堆,冒泡,快排,归并,基数)
- C++数据结构 排序 二分 插入 冒泡 基数 归并 直选 快排 希尔 堆排序
- 【基础排序算法】最常见的三种排序算法(冒泡、插入、选择)