基于vector<node*>来写的一种基数排序
基数排序原理如链接https://blog.csdn.net/u012580566/article/details/47702955
#include<iostream>
#include<vector>
using namespace std;
struct node {
int val;
node* next;
node(int x) :val(x), next(NULL) {}
};
node* insert(node* head, int val) {//插入节点的函数
node* t = new node(val);
if (head == NULL) { return t; }
node* pre = NULL;
node* cur = head;
while (cur) {
if (val > cur->val) {
pre = cur; cur = cur->next;
}
else { break; }
}
if (pre == NULL) { t->next = cur; return t; }
pre->next = t; t->next = cur;
return head;
}
void radixSort(vector<int>& a) {
//获取数组的最大最小值,若有负数先全部转变为正数来处理*/
int oMax = INT_MIN; int oMin = INT_MAX;
for (auto i : a) {
if (i >= oMax) { oMax = i; }
if (i <= oMin) { oMin = i; }
}
for (int i = 0; i < a.size(); i++) { a[i] = a[i] - oMin; }
//计算出转变后最大值的位数,i就是最大的位数
int t = oMax - oMin; int i=1;
while (t > 9) { t = t / 10; i++; }
//开始循环排序
for (int r = 10; i > 0;r*=10) {
vector<node*> temp(10);
for (auto j : a) {
int index = j % r;
index = index / (r / 10);
temp[index] = insert(temp[index], j);
}
i--;
int j = 0;
for (auto x : temp) {
node* cur = x;
while (cur) {
a[j] = cur->val;
cur = cur->next; j++;
}
}
}
//还原数据
for (int i = 0; i < a.size(); i++) { a[i] = a[i] + oMin; }
}
int main(){
vector<int> t;
for (int i = 0; i < 20; i++) {
t.push_back(rand() % 100-50);
}
for (auto i : t) { cout << i << "->"; }
radixSort(t); cout << endl;
for (auto i : t) { cout << i << "->"; }cout << endl;
system("Pause");
return 0;
}