//选择排序:最值出现在起始端
void selectSort(int *arr, int length) {
for (int i = 0; i < length - 1; i++) { //趟数
for (int j = i + 1; j < length; j++) { //比较次数
if (arr[i] > arr[j]) {//i,j
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
printf("selectSort\n");
for(int i = 0; i<length ;i++)
printf("%d ",arr[i]);
}
//冒泡排序:邻元素两两比较,比较完一趟,最值出现在末尾
void bublleSort(int *arr, int length) {
for(int i = 0; i < length - 1; i++) { //趟数
for(int j = 0; j < length - i - 1; j++) { //比较次数
if(arr[j] > arr[j+1]) {//j,j+1
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
printf("bublleSort\n");
for(int i = 0; i<length ;i++)
printf("%d ",arr[i]);
}
//快速排序:以第一个数字为key,比key小的放key前,比key大的放key后,然后递归;
void sort(int *a, int left, int right)
{
//结束
if(left >= right)
{
return ;
}
int i = left;
int j = right;
int key = a[left];
//排序
while(i < j)
{
//尾值比key大,
while(i < j && key <= a[j])
{
j--;/*向前寻找*/
}
//比key小的放key前,i是前,j是后
a[i] = a[j];
while(i < j && key >= a[i])
{
i++;/*向后寻找*/
}
//比key的大放key后
a[j] = a[i];
}
//中间数key放好位置,递归排序
a[i] = key;
sort(a, left, i - 1);/*key左*/
sort(a, i + 1, right);/*key右*/
printf("sort in \n");
for(int i = 0; i<=right;i++){
printf("%d ",a[i]);
}
}
//二分查找有序数组:递归算法
参考:https://baike.baidu.com/item/%E4%BA%8C%E5%88%86%E6%B3%95%E6%9F%A5%E6%89%BE/9751511?fr=aladdin
int recurbinary(int *a, int key, int low, int high)
{
int mid;
if(low > high)
return -1;
mid = low + (high-low)/2;
if(a[mid] == key) return mid;
else if(a[mid] > key)
return recurbinary(a,key,low,mid -1);
else
return recurbinary(a,key,mid + 1,high);
}
//台阶蓄水统计:找第一个左降点,然后找第一个右升点;找到后,再找下一个升点;
int stepsWater(unsigned int *steps, unsigned int len){
//无拐点
if (len < 3)
return 0;
//积水量
int sum = 0;
int begin = 0;
int end = 0;
unsigned int leftMax = 0;
unsigned int rightMax = 0;
for (int i = 0; i < len - 2; i ++) {
//左降点
if ((steps[i] > steps[i+1])) {
begin = i;
leftMax = steps[i];
int j = i+1;
int isUp = 0;
while (j < len - 1) {
if (steps[j] < steps[j+1]) {
if (isUp == 0) {
isUp = 1;
}
rightMax = steps[j+1];
i = j+1;
j++;
}else if(steps[j] == steps[j+1]){
i = j+1;
j++;
}else{
//先升后降,则退出去查询下一个拐点
if (isUp){
i = j-1;
break;
}else{
i = j+1;
j++;
}
}
}
//统计蓄水量
int waterNum = 0;
end = j;
if(leftMax < rightMax){
for(int k = 0;begin+1+k < end;k++){
waterNum = leftMax - steps[begin+1+k];
if (waterNum > 0) {
sum += waterNum;
}else{
break;
}
}
}else{
for(int k = end - 1;k > begin;k--){
waterNum = rightMax - steps[k];
if (waterNum > 0) {
sum += waterNum;
}else{
break;
}
}
}
}
}
return sum;
}