1、选择排序(了解)
循环n-1次,每次从未排序的数组头开始向后找,找到最小值,与数组头交换位置。即先选出最小的,再选出第二小的......
2、插入排序(熟悉)
从头开始遍历,每次把一个元素插入到前面已经排好序的数组中。
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
int len = nums.size();
for(int i = 1;i < len;i++){
int temp = nums[i];
int j = i;
while(j > 0 && nums[j - 1] >= temp){
nums[j] = nums[j - 1];
j--;
}
nums[j] = temp;
}
return nums;
}
};
3、归并排序(重点)
将一个数组对半分,把两边排成有序数组后,再合成两个有序数组。
写代码时分成两个函数MergeSort和Merge。递归执行MergeSort,在递归后Merge一下。递归结束的条件是r==l.
#include<iostream>
using namespace std;
void Merge(int arr[], int l, int q, int r){
int n=r-l+1;//临时数组存合并后的有序序列
int* tmp=new int[n];
int i=0;
int left=l;
int right=q+1;
while(left<=q && right<=r)
tmp[i++] = arr[left]<= arr[right]?arr[left++]:arr[right++];
while(left<=q)
tmp[i++]=arr[left++];
while(right<=r)
tmp[i++]=arr[right++];
for(int j=0;j<n;++j)
arr[l+j]=tmp[j];
delete [] tmp;//删掉堆区的内存
}
void MergeSort(int arr[], int l, int r){
if(l==r)
return; //递归基是让数组中的每个数单独成为长度为1的区间
int q = (l + r)/2;
MergeSort(arr, l, q);
MergeSort(arr, q + 1, r);
Merge(arr, l, q, r);
}
int main(){
int a[8] = {3,1,2,4,5,8,7,6};
MergeSort(a,0,7);
for(int i=0;i<8;++i)
cout<<a[i]<<" ";
}
4、快速排序(重点)
先使用分割思想确定一个元素的位置,再对分割的两边分别递归。
也是递归的思想。QuickSort与partition。QuickSort用来递归,递归的判断条件为r<l。先partition再对剩下的两个子部分进行QuiciSort。partition中注意最好随机选择基准。然后先判断右指针再判断左。(因为左指针的值为基准)
#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
int GetLoca(int a[],int l,int r){
int left = l,right = r;
int randomIndex = l + rand() %(r - l + 1);
swap(a[left],a[randomIndex]);
int key = a[left];
while(left < right){
while(left < right && a[right] >= key)
right--;
if(left < right)
a[left] = a[right];
while(left < right && a[left] <= key){
left++;
}
if(left < right)
a[right] = a[left];
}
a[left] = key;
return left;
}
void QuickSort(int a[],int l,int r){
if(l < r){
int loc = GetLoca(a,l,r);
QuickSort(a,l,loc - 1);
QuickSort(a,loc + 1,r);
}
}
int main(){
int a[8] = {3,1,2,4,5,8,7,6};
int left = 0,right = 7;
srand(time(nullptr));
QuickSort(a,left,right);
for(int i = 0;i <= right;i++){
std::cout << a[i];
}
}