学习:
冒泡、选择图解看这个链接
<注意:!!里面程序是不对的,但是冒泡和选择的算法可视化做的很清楚>
快排算法基本思想
<主要包含两种:挖坑和双指针>
大佬写得快排C++实现
根据题目写几种排序算法:
lc
选择排序:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int j =m;
for(int i = 0 ;i<n ; i++ ){
nums1[j] = nums2[i];
j++;
}
for (int p =0 ;p< nums1.size() ; p++){
for(int q = p+1 ; q < nums1.size() ; q++){
int temp;
if(nums1[p] > nums1[q]){
temp = nums1[p];
nums1[p] = nums1[q];
nums1[q] = temp;
}
}
}
}
};
选择排序这样写并不好,原因在于:遇到一个满足条件的就去交换一次,其实浪费了很多时间在“不必要的交换”上。按照下面的写法重新写:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int j =m;
for(int i = 0 ;i<n ; i++ ){
nums1[j] = nums2[i];
j++;
}
int temp;
for (int p =0 ;p< nums1.size() ; p++){
temp = p;
for(int q = p+1 ; q < nums1.size() ; q++){
if(nums1[temp] > nums1[q]){
temp = q;
}
}
swap(nums1[p],nums1[temp]);
}
}
};
啊,尴尬的事情出现了,好像内存、时间都没什么变化,看来差别不大。
冒泡排序法:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int j =m;
for(int i = 0 ;i<n ; i++ ){
nums1[j] = nums2[i];
j++;
}
//这里
int temp;
for (int cunt = nums1.size()-1 ; cunt > 0; cunt-- ){
for(int p = 0 ; p < cunt ;p++ ){
if(nums1[p] > nums1[p+1]){
temp = nums1[p+1];
nums1[p+1] = nums1[p];
nums1[p] = temp;
}
}
}
}
};
写冒泡的时候我zz了,写成了:
int temp;
for (int cunt = nums1.size()-1 ; cunt > 0; cunt-- ){
for(int p = 0 ,q = p+1 ; p < cunt ;p++ ){
if(nums1[p] > nums1[q]){
temp = nums1[q];
nums1[q] = nums1[p];
nums1[p] = temp;
}
}
}
这里q并没有跟着p一直++,这么简单的算法错误不该犯。
快速排序法:
class Solution {
public:
void quickSort(int left, int right, vector<int>& arr)
{
if(left >= right)
return;
int i, j, base;
i = left, j = right;
base = arr[left];
while (i < j)
{
while (arr[j] >= base && i < j)
j--;
while (arr[i] <= base && i < j)
i++;
if(i < j)
{
swap(arr[i] , arr[j]);
}
}
swap(arr[left], arr[i]);
quickSort(left, i - 1, arr);
quickSort(i + 1, right, arr);
}
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int j =m;
for(int i = 0 ;i<n ; i++ ){
nums1[j] = nums2[i];
j++;
}
quickSort(0,nums1.size()-1 ,nums1);
}
};
自己写得时候:
swap(base, arr[i]);//这里写成base之后运行结果不对,还没有搞清楚原因
quickSort(left, i - 1, arr);
quickSort(i + 1, right, arr);
//啊,我好像知道了,base 只是一个int,用一个数去换数组里面的某一个元素,所以出问题????
其它:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int j =m;
for(int i = 0 ;i<n ; i++ ){
nums1[j] = nums2[i];
j++;
}
sort(nums1.begin(), nums1.end());
}
};