简单选择
void Selectsort(int a[],int start,int n) {
if(start==n-1)return ;
for(int i=start;i<n;i++){
if(a[start]>a[i])
swap(a[start],a[i]);
}
Selectsort(a,start+1,n);
}
冒泡排序
void Bubblesort(int a[],int start,int n){
if(n == 1) return ;//当剩下最后一个数时 返回
int flag = 0;
for(int i=start;i<n-1;i++){//n结束到倒数第二个数结束,因为if是往后比较
if(a[i]>a[i+1])
{
swap(a[i],a[i+1]);
flag=1;
}
}
if(flag == 0)return ;//注意
Bubblesort(a,start,n-1);
}
两个注意的点: 1. for循环到达为 i = n -1 2.n ==1 时停止
快排
void quickersort(int a[],int start,int end){
if(start<end){
int base = a[start];
int left = start;
int right = end;
while(left<right){
while(left<right&&a[right]>=base) right--;
a[left] = a[right];
while(left<right&&a[left]<=base) left++;
a[right] = a[left];
}
a[left] = base;
}
quickersort(a,start, left - 1)
quickersort(a,left+1,end);
}
归并排序
#include <iostream>
#include <vector>
using namespace std;
int a[10] = {1, 2, 5, 6, 4, 7, 9, 8, 3, 0};
void merge(int a[], int left, int mid, int right) {
vector<int> temp(right - left + 1);//分配临时数组存储变量
//定义 左半区第一个未排元素
int l_post = left;
//定义 右半区第一个未排元素
int r_post = mid + 1;
//临时数组的下标
int post = 0;
//合并两数组
while (l_post <= mid && r_post <= right) {//左半区第一个剩余元素小
if (a[l_post] < a[r_post])
temp[post++] = a[l_post++];
else//右半区第一个剩余元素小
temp[post++] = a[r_post++];
}
//合并左半区剩余元素
while (l_post <= mid)
temp[post++] = a[l_post++];
//合并右半区剩余元素
while (r_post <= right)
temp[post++] = a[r_post++];
//复制到原来的数组
for (int i = 0; i < post; i++) {
a[left + i] = temp[i];
}
}
void mergesort(int a[], int left, int right) {
//只有一个元素就不需要排序,只需要执行归并
if (left < right) {//中间只有1个元素时不需要划分
int mid = (left + right) / 2;
mergesort(a, left, mid);
mergesort(a, mid + 1, right);
//一边拆分一边合并
merge(a, left, mid, right);
}
}
int main() {
mergesort(a, 0, 9);//左右封闭进行排序
for (int i = 0; i < 10; i++)
cout << a[i] << " ";
}
使用辅助数组进行排序,但是需要注意最后复制辅助数列到原数列的过程中,用到了left + i