C++数据结构03--排序算法

#include "stdafx.h"
#include <iostream> 
#include <windows.h>
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;  
Sleep(500);
            }  
        }  
    }  
}  
  
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;  
Sleep(500);
    }  
}  
   
  
  
  //基数排序
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);    
Sleep(500);
    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> 
int Max(T a[],int n)
{
int pos=0;
for (int i = 1; i < n; i++)
{
if (a[pos]<a[i])
{
pos=i;
return pos;
}
}


}




template <class T> 
void Swap(T &a,T &b)
{


T temp=a;a=b;b=temp;
}


template <class T> 
void Selection(T a[],int n)
{
for (int size = n; size < 1; size--)
{
int j=Max(a,size);
Swap(a[j],a[size-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);  
}  
  
 


int _tmain(int argc, _TCHAR* argv[])
{
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-基数排序、4-选择排序"<<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;  
case 4:  
        cout<<"选择排序"<<endl;  
Selection(inputNumber,count);  
        show(inputNumber,count);  
        break;  
    default:  
        break;  
    }  
    cout<<"End"<<endl;  
return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值