数据结构快速排序16和16*谁大?
关键字序列是{12 2 16 30 28 10 16* 20 6 18}
如果是按照字符串排序,肯定是 16 * 更大。
不知道你这个问题是否已经解决, 如果还没有解决的话:自己写的进制转换函数,理论是到36进制(因为字母不够 ),如果要字母大写改一下就好了,若有错请斧正。
string trans(string num ,int from ,int to) { //num待转换数,from和to表示进制
ll tmp, ten = 0;
string ans;
char c;
for(int i=0;i<num.size();i++){ //from进制转换为10进制
ten *= from;
if (num[i] >= '0' && num[i] <= '9')
tmp = num[i] - '0';
else tmp = num[i] - 'a' + 10;
ten += tmp;
}
//cout << ten << "\n";
while (ten) { //10进制转换为to进制
tmp = ten % to;
c = tmp < 10 ? tmp + '0' : tmp - 10 + 'a';
ans += c;
ten /= to;
}
reverse(ans.begin(), ans.end());
return ans;
}
测试结果
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string trans(string num ,int from ,int to) { //num待转换数,from和to表示进制
ll tmp, ten = 0;
string ans;
char c;
for(int i=0;i<num.size();i++){ //from进制转换为10进制
ten *= from;
if (num[i] >= '0' && num[i] <= '9')
tmp = num[i] - '0';
else tmp = num[i] - 'a' + 10;
ten += tmp;
}
//cout << ten << "\n";
while (ten) { //10进制转换为to进制
tmp = ten % to;
c = tmp < 10 ? tmp + '0' : tmp - 10 + 'a';
ans += c;
ten /= to;
}
reverse(ans.begin(), ans.end());
return ans;
}
int main() {
//测试2,8,10,16进制相互转换
cout << trans("351306", 8, 2) << "\n";
cout << trans("946351", 10, 2) << "\n";
cout << trans("a6b816", 16, 2) << "\n";
cout << "\n";
cout << trans("101111111001", 2, 8) << "\n";
cout << trans("13541913", 10, 8) << "\n";
cout << trans("a6b8c9def", 16, 8) << "\n";
cout << "\n";
cout << trans("10000001", 2, 10) << "\n";
cout << trans("6543210", 8, 10) << "\n";
cout << trans("fe60a6b8c", 16, 10) << "\n";
cout << "\n";
cout << trans("1101010101", 2, 16) << "\n";
cout << trans("66240", 8, 16) << "\n";
cout << trans("98109813", 10, 16) << "\n";
return 0;
}
https://blog.csdn.net/qq_45034708原创不易,请勿转载(
本不富裕的访问量雪上加霜)
博主首页:
我可以解决该问题。根据快速排序的算法,选取一个枢轴(pivot)元素,将序列按照其大小分为两部分,小于枢轴的在左边,大于枢轴的在右边,再对左右两部分递归地进行快排。具体操作如下:
首先选取序列中的一个元素作为pivot(本例中选取最后一个元素18);
从序列左端开始和右端开始两个指针i和j,当i<j时,先从右端j开始往左遍历,找到第一个小于pivot的元素,将其与位置i交换,然后从左端i开始往右遍历,找到第一个大于pivot的元素,将其与位置j交换;
继续i<j时的遍历,重复进行2操作,直到i=j为止,此时序列被分为左右两个部分,左边的元素均小于等于pivot,右边的元素均大于等于pivot;
对左右两个部分递归进行快排。
具体代码如下:
using namespace std;
void quickSort(int arr[], int left, int right) { if (left >= right) { return; } int pivot = arr[right]; // 选取最后一个元素作为pivot int i = left, j = right; while (i < j) { // 从序列左右两端开始遍历 while (i < j && arr[j] >= pivot) { // 从右端j开始往左遍历,找到第一个小于pivot的元素 j--; } if (i < j) { arr[i++] = arr[j]; // 把小于pivot的元素移到i位置处 } while (i < j && arr[i] < pivot) { // 从左端i开始往右遍历,找到第一个大于等于pivot的元素 i++; } if (i < j) { arr[j--] = arr[i]; // 把大于等于pivot的元素移到j位置处 } } arr[i] = pivot; // 把pivot放到序列中间 quickSort(arr, left, i - 1); // 对左边的部分递归进行快排 quickSort(arr, i + 1, right); // 对右边的部分递归进行快排 }
int main() { int arr[] = {12, 2, 16, 30, 28, 10, 16, 20, 6, 18}; // 给定关键字序列 int n = sizeof(arr) / sizeof(int); quickSort(arr, 0, n - 1); // 对序列进行快排 if (arr[6] > arr[7]) { // 判断16和16的大小关系 cout << "16大于16" << endl; } else if (arr[6] < arr[7]) { cout << "16小于16" << endl; } else { cout << "16等于16" << endl; } return 0; }
输出结果为:16等于16*,说明这两个关键字相等。