从上一学期期末考完之后就鸽了,真的惭愧,还想着期末考完就开始呢,结果考驾照完了后又有学校项目要忙活。终于是拖到开学了哈哈,虽然现在事情也比较多,但是总归是要开始的,不然马上就要拖延症晚期了!!!
加油加油,冲冲冲。看看能不能冲一下CCF
推荐一个算法动画网站:https://visualgo.net/zh/sorting
一、基本理解
选择排序就是每一轮都选择最小 | 最大的值放到最前面,等到遍历完毕即可完成排序
大致算法步骤:
- 两层循环: 第一层定义每轮最初的假定最小 | 最大值; 第二层则是进行比较找出最小值
- 每一次内循环完毕后需要将当前找到的最小值移动到前面。
- 如此往复,可排序成功
二、题目练习
75. 颜色分类
没什么好说的,基本思路,都能看懂。
void sortColors(int* nums, int numsSize) {int n = numsSize;for(int i = 0; i < n - 1; ++i) {int minIdx = i; //最初假定最小值点为ifor(int j = i + 1; j < n; ++j) {//判断是否小于"最小值""if(nums[j] < nums[minIdx]) {minIdx = j;}}// 交换int temp = nums[i];nums[i] = nums[minIdx];nums[minIdx] = temp;}
}
4. 寻找两个正序数组的中位数
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {int n = nums1Size + nums2Size;int * arr = (int *)malloc(sizeof(int) * n);// 两个数组整合到一个数组for(int i = 0; i < nums1Size; ++i) {arr[i] = nums1[i];}for(int i = 0; i < nums2Size; ++i) {arr[i + nums1Size] = nums2[i];}// 排序数组for(int i = 0; i < n - 1; ++i) {int minIdx = i;for(int j = i + 1; j < n; ++j) {if(arr[j] < arr[minIdx]) {minIdx = j;}}int temp = arr[i];arr[i] = arr[minIdx];arr[minIdx] = temp;}// 中位数if(n % 2) {return arr[n / 2];}else {return (arr[n / 2] + arr[n / 2 - 1]) / 2.0;}
}
747. 至少是其他数字两倍的最大数
int dominantIndex(int* nums, int numsSize) {int n = numsSize;int i = 0;int maxIdx = i;// 只内循环一次就可以,取消外循环for(int j = i + 1; j < n; ++j) {if(nums[j] > nums[maxIdx]) {maxIdx = j;}}// 判断是否是数组中每个其他数字的两倍for(int i = 0; i < n; ++i) {if(i == maxIdx) continue;if(nums[i] * 2 > nums[maxIdx]) {return -1;}}return maxIdx;
}
1502. 判断能否形成等差数列
bool canMakeArithmeticProgression(int* arr, int arrSize) {int n = arrSize;for(int i = 0; i < n - 1; ++i) {int minIdx = i;for(int j = i + 1; j < n; ++j) {if(arr[j] < arr[minIdx]) {minIdx = j;}}int tmp = arr[i];arr[i] = arr[minIdx];arr[minIdx] = tmp;}for(int i = 0; i < n - 2; ++i) {if(arr[i + 1] - arr[i] != arr[i + 2] - arr[i + 1]) {return false;}}return true;
}