选择排序(注意如果maxi为begin,那么再将begin与mini对换的时候,maxi其实是现在mini指向的,故要让maxi=mini
void selectsort(int*a,int n){
int begin=0;
int end=n-1;
while(begin<end){
int mini=begin;
int maxi=begin;
for(int i=begin;i<=end;i++){
if(a[i]<a[mini]){
mini=i;
}
if(a[i]>a[maxi]){
maxi=i;
}
}
swap(&a[begin],&a[mini]);
if(begin==maxi){
maxi=mini;
}
swap(&a[maxi],&a[end]);
begin++;
end--;
}
}
堆排序
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
void adjustdown(int* a,int n ,int parent) {
int child = parent * 2 + 1;
while (child < n) {
if (child + 1 < n && a[child] > a[child + 1]) {
child++;
}
if (a[child] < a[parent]) {
swap(&a[child], &a[parent]);
parent = child;
child = parent * 2 + 1;
}
else {
break;
}
}
}
void heapsort(int* a, int n) {
for (int i = (n - 1 - 1) / 2;i >= 0;i--) {
adjustdown(a, n, i);
}
int end = n - 1;
while (end > 0) {
swap(&a[0], &a[end]);
adjustdown(a, end, 0);
end--;
}
}
插入排序
void insertsort(int*a,int n){
for(int i=0;i<n-1;i++){
int tmp=a[i+1];
int end=i;
while(end>=0){
if(a[end]>tmp){
a[end+1]=a[end];
end--;
}
else{
break;
}
}
a[end+1]=tmp;
}
}
希尔排序
void shellsort(int* a, int n) {
int gap=n;
while(gap>1){
gap=gap/3+1;
for(i=0;i<n-1;i++){
int tmp=a[i+gap];
int end=i;
while(end>=0){
if(a[end]>tmp){
a[end+gap]=a[gap];
end-=gap;
}
else{
break;
}
}
a[end+gap]=tmp;
}
}
}