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