1.
最终要达成效果:
代码实现:
#include<string.h>
void rank_r_salary(char uid[10][5], int r_salary[10]) {
//int i=0,j=0;
int a[10];
int i = 0, j = 0, x = 0, n = 1;
for (i = 0; i < 10; i++)
{
a[i] = r_salary[i];
}
printf("代号: 实发工资:\n");
for (j = 0; j < 10; j++)
{
int max = a[0];
for (i = 0; i < 10; i++)
{
if (a[i]>max)
{
x = i;
max = a[i];
}
}
printf("%-10s%-10d\n",uid[x],r_salary[x]);
a[x] = 0;
x = 0;
}
}
void rank_t_salary_id(char uid[10][5], int t_salary[10], int rid[10]) {
int a[10];
int i = 0, j = 0, x = 0, n = 1;
for (i = 0; i < 10; i++)
{
a[i] = t_salary[i];
}
for (j = 0; j < 10; j++)
{
int max = a[0];
for (i = 0; i < 10; i++)
{
if (a[i]>max)
{
x = i;
max = a[i];
}
}
a[x] = 0;
rid[x] = n;
x = 0;
n++;
}
printf("代号: 应发工资:名次: \n");
for(i=0;i<10;i++)
{
printf("%-10s%-10d%-10d\n",uid[i],t_salary[i],rid[i]);
}
}
如果只要实现rank_r_salary()函数则可以:
#include<string.h>
#include<string.h>
void rank_r_salary(char uid[10][5], int r_salary[10]) {
int i = 0, j = 0;
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9 - i; j++)
{
if (r_salary[j] < r_salary[j + 1])
{
int tmp1 = r_salary[j];
r_salary[j] = r_salary[j - 1];
r_salary[j + 1] = tmp1;
char tmp2[10];
strcpy(tmp2, uid[j]);
strcpy(uid[j], uid[j + 1]);
strcpy(uid[j + 1], tmp2);
}
}
}
printf("代号:\t实发工资:\t\n");
for (i = 0; i < 10; i++)
printf("%s\t%d\t\n", uid[i], r_salary[i]);
}
但这样就改变了uid[10]的顺序,在实现第二个函数时就会出现问题
2.
若直接查找最小值则代码实现为:
/**
*
* @param rotateArray int整型一维数组
* @param rotateArrayLen int rotateArray数组长度
* @return int整型
*/
int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) {
int i=0,min=rotateArray[0];
for(i=1;i<rotateArrayLen;i++)
{
if(rotateArray[i]<min)
{
min=rotateArray[i];
}
}
return min;
}
若采用二分查找的方法也就是题目所考察的代码实现为:
int minNumberInRotateArray(int* rotateArray, int rotateArrayLen )
{
int left=0;
int right=rotateArrayLen-1;
while(left<right)
{
int mid=left+(right-left)/2;
if(rotateArray[mid]<rotateArray[right])
right=mid;
else if(rotateArray[mid]>rotateArray[right])
left=mid+1;
else
right--;
}
return retateArray[left];
}
3