主要参考:
第 6 节 三路快排
- 分治算法
- 快速排序
- 划分函数 partition
- 快排递归算法 quick_sort
- 三划分快排
- leetcode部分题目
- 75. 颜色分类
分而治之
条件:
(1)原问题可以分解成若干个规模比较小的相同子问题。
(2)子问题相互独立。
(3)子问题的解可以合并为原问题的解。
写法一:
int partition(vector& arr, int low, int high){ int i=low,j=high; int base=arr[low];//选取第一个元素作为基准 while(i while(i base ){//high从右往左扫描 寻找小于base的值 j--; } if(i //交换 swap(arr[i], arr[j]); i++; } while(i //high从左往右扫描 寻找大于base的值 i++; } if(i swap(arr[i], arr[j]); j--; } } return i; }
写法二:
int partition(vector快排递归算法 quick_sort& arr, int low, int high) { if(low > high) return low; int i=low; int j=high; int base=arr[low]; while(i while(i =base) j--; while(i int t = arr[i]; arr[i] = arr[j]; arr[j] = t; //swap(arr[i],arr[j]); } } arr[low]=arr[i]; arr[i]=base; //swap(arr[low],arr[i]); return i; }
void quick_sort(vector三划分快排& arr, int start, int end){ int pos; if (start pos = partition(arr, start, end); quick_sort(arr,start,pos-1); quick_sort(arr,pos+1,end); } return; }
详细可看视频:第 6 节 三路快排
void Quick_Sort(vectorleetcode部分题目 75. 颜色分类&nums, int left, int right){ if (left >= right) return; int lt = left+1; int gt = right; int i = left+1; swap(nums[left], nums[rand() % (right - left + 1) + left]); int temp = nums[left]; while(i <= gt){ if(nums[i] < temp){ swap(nums[i], nums[lt]); i++; lt++; } else if(nums[i] == temp){ i++; } else if(nums[i] > temp){ swap(nums[i], nums[gt]); gt--; } } swap(nums[left], nums[lt-1]); Quick_Sort(nums, left, lt-1); Quick_Sort(nums, gt+1, right); }
75. 颜色分类
快排:
class Solution {
public:
int partition(vector& arr, int low, int high){
int i=low,j=high;
int base=arr[low];//选取第一个元素作为基准
while(i
while(i base ){//high从右往左扫描 寻找小于base的值
j--;
}
if(i//交换
swap(arr[i], arr[j]);
i++;
}
while(i//high从左往右扫描 寻找大于base的值
i++;
}
if(i
swap(arr[i], arr[j]);
j--;
}
}
return i;
}
void quick_sort(vector& arr, int start, int end){
int pos;
if (start
pos = partition(arr, start, end);
quick_sort(arr,start,pos-1);
quick_sort(arr,pos+1,end);
}
return;
}
void sortColors(vector& nums) {
//快排 以1为基准 扫描一次可以得到最终结果
quick_sort(nums,0,nums.size()-1);
}
};



