学习知识:
1.若compar小于0,则p1所指元素在p2所指元素左边;
若compar大于0,则p1所指元素在p2所指元素右边;
int compar(const void *p1, const void *p2);
2.撰写函数时,若不确定p1是什么类型,可以用void*代表空指针,再之后对其赋形。
递增函数:
int cmp(const void*p1, const void *p2) { // (1)
int v1 = *(int *)p1; // (2)
int v2 = *(int *)p2; // (3)
if(v1 < v2) { // (4)
return -1;
}else if(v1 > v2) {
return 1;
}
return 0;
}
3.奇数在后,偶数在前比较函数:
int Qua(int x) {
return x % 2;
}
int cmp(const void *p1, const void *p2) {
return Qua(*(int *)p1) - Qua(*(int *)p2);
}
4.qsort函数(c语言快速排序函数)
//int (*cmp)(const void *,const void *);
qsort(*s, n, sizeof(s[0]), cmp);
其中第一个参数s是一个地址,即参与排序的首地址;
n是需要排序的数量;
sizeof(s[0])则是每一个元素占用的空间大小;
指向函数的指针,用于确定排序的顺序。
简单的说:对一个长为1000的数组进行排序时,int a[1000];
题目如下:
---------------------------------------------------------------------------------------------------------------------------------
一、
难度中等492
给你一个整数数组 nums
,请你将该数组升序排列。
示例 1:
输入:nums = [5,2,3,1] 输出:[1,2,3,5]
示例 2:
输入:nums = [5,1,1,2,0,0] 输出:[0,0,1,1,2,5]
接下来展示几种排序算法:(每天实现)
快速排序:
class Solution {
public:
void quicksort(vector<int>& a,int left,int right){
if(left>=right)return;
int i=left-1,j=right+1;
int mid=(left+right)/2;
int key=a[mid];
while(i<j)
{
while(a[++i]<key);
while(key<a[--j]);
if(i<j)swap(a[i],a[j]);
}
quicksort(a,left,j);
quicksort(a,j+1,right);
}
vector<int> sortArray(vector<int>& nums) {
int n=nums.size();
quicksort(nums,0,n-1);
return nums;
}
};
下列问题代码阐述:
void quicksort(vector<int>& a,int left,int right){
if(left>right)return;
int i=left,j=right;
int key=a[left];
while(i<j)
{
while(key<=a[j]&&i<j)
{
j--;
}
while(a[i]<=key&&i<j)
{
i++;
}
swap(a[i],a[j]);
}
a[left]=a[j];
a[j]=key;
quicksort(a,left,j-1);
quicksort(a,j+1,right);
}
vector<int> sortArray(vector<int>& nums) {
int n=nums.size();
quicksort(nums,0,n-1);
return nums;
}
为什么需要++i和--j?
需要先进行i+1,若此时不满足while条件,才是大于a[mid]的那个数;如果是:后一种算法若是j--,则再while结束时就会j--,此时原本不符合while的a[j]不是原来不符合的a[j]而是a[j-1];
为什么使用mid?
防止某特殊已排序数组造成时间过长;
---------------------------------------------------------------------------------------------------------------------------------
二、
难度简单1336
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋
的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
投票法(贪心算法):
class Solution {
public:
int majorityElement(vector<int>& nums) {
int candidate = -1;
int count = 0;
for (int num : nums) {
if (num == candidate)
++count;
else if (--count < 0) {
candidate = num;
count = 1;
}
}
return candidate;
}
};
其他方法每天看。