1、选择排序:
首先找到数组的最小元素,并将其与第一个元素交换位置。然后,再在剩下的元素中找到最小的元素,与数组的第二个元素交换位置。循环整个数组。
- 时间复杂度: O(n2)
- 空间复杂度: O(1)
- 非稳定排序
- 原地排序
原理:
vector<int> SelectSort(vector<int> & nums){
int n = nums.size();
for(int i=0;i<n-1;i++){
int min = i;
for(int j=i;j<n;j++){
if(nums[j]<nums[min]){
min = j;
}
}
swap(nums[i],nums[min]);
// int temp = nums[i];
// nums[i] = nums[min];
// nums[min] = temp;
}
return nums;
}
2、插入排序:
从数组的第二个元素开始,将它与左边的元素比较,如果左边第一个元素比它大,则继续与左边第二个元素比较,知道遇到不比它大的元素,然后插到这个元素的右边。
- 时间复杂度: O(n2)
- 空间复杂度: O(1)
- 稳定排序
- 原地排序
原理:
vector<int> InsertSort(vector<int> & nums){
int n = nums.size();
if(n<2) return nums;
for(int i=1;i<n;i++){
int temp = nums[i];
int k = i-1;
while(k>=0&&nums[k]>temp){//找到插入元素的位置
k--;
}
for(int j=i;j>k+1;j--){ //为插入的元素腾出位置
nums[j] = nums[j-1];
}
nums[k+1] = temp; //插入元素
}
return nums;
}
3、冒泡排序:
从数组的第一个元素开始,将其与第二个元素比较,如果第一个比第二个大,则交换它们的位置。接着比较第二个元素和第三个元素,如果第二个比第三个大,则交换它们的位置。对每一对相邻元素作同样的工作。这样排在最后的元素就会是最大的,然后除去最右边的元素,对剩余元素做同样的工作。
- 时间复杂度: O(n2)
- 空间复杂度: O(1)
- 稳定排序
- 原地排序
原理:
vector<int> BubbleSort(vector<int> & nums){
int n = nums.size();
if(n<2) return nums;
for(int i=0;i<n;i++){
for(int j=0;j<n-1-i;j++){
if(nums[j+1]<nums[j]){
swap(nums[j],nums[j+1]);
// int temp = nums[j];
// nums[j] = nums[j+1];
// nums[j+1] = temp;
}
}
}
return nums;
}
优化:
如果从第一对到结尾最后一对,都没有发生过交换,则数组已经是排序好的了,不用再比较了。
vector<int> BubbleSort(vector<int> & nums){
int n = nums.size();
if(n<2) return nums;
for(int i=0;i<n;i++){
bool falg = true;
for(int j=0;j<n-1-i;j++){
if(nums[j+1]<nums[j]){
falg = false;
swap(nums[j],nums[j+1]);
// int temp = nums[j];
// nums[j] = nums[j+1];
// nums[j+1] = temp;
}
}
if(falg){
break;
}
}
return nums;
}