交换排序
(1)冒泡排序
#include<stdio.h>
#include<iostream>
using namespace std;
void P(int a[],int n) {
for(int i=0; i<n; i++)
cout<<a[i]<<" ";
cout<<endl;
}
void bubblesort(int a[],int len) {
int flag=true;
for(int i=0; i<len&&flag; i++) {
flag=false;
for(int j=i+1; j<len; j++) {
if(a[i]>a[j]) {
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
flag=true;
}
}
}
}
int main() {
int a[]= {8,5,0,3,7,1,2};
P(a,7);
bubblesort(a,7);
P(a,7);
return 0;
}
时间复杂度:O(n2)
(2)快速排序
#include<stdio.h>
#include<iostream>
using namespace std;
void P(int a[],int n)
{
for(int i=0; i<n; i++)
cout<<a[i]<<" ";
cout<<endl;
}
void quick_sort(int s[],int l,int r) {
if(l<r) {
int i=l,j=r,x=s[l];
while(i<j) {
while(i<j&&s[j]>x)
j--;
if(i<j)
s[i++]=s[j];
while(i<j&&s[i]<x)
i++;
if(i<j)
s[j--]=s[i];
}
s[i]=x;
quick_sort(s,l,i-1);
quick_sort(s,i+1,r);
}
}
int main() {
int a[]= {10,9,8,7,6,5,4,3,2,1};
P(a,10);
quick_sort(a,0,9);
P(a,10);
return 0;
}
时间复杂度:O(nlog2(n))
选择排序
(1)简单选择排序
#include<stdio.h>
#include<iostream>
using namespace std;
void P(int a[],int n) {
for(int i=0; i<n; i++)
cout<<a[i]<<" ";
cout<<endl;
}
void selectsort(int a[],int len) {
for(int i=0; i<len-1; i++) {
int min=i;
for(int j=i+1; j<len; j++) {
if(a[j]>a[min]) {
min=j;
}
}
if(min!=i)
swap(a[i],a[min]);
}
}
int main() {
int a[]= {8,5,0,3,7,1,2};
P(a,7);
selectsort(a,7);
P(a,7);
return 0;
}
时间复杂度:O(n2)
(2)堆排序
①建大堆(降序)
#include<iostream>
using namespace std;
void P(int a[],int n)
{
for(int i=0; i<n; i++)
cout<<a[i]<<" ";
cout<<endl;
}
void AdjustDown(int arr[],int i,int n) {
int j=i*2+1;
while(j<n) {
if(j+1<n&&arr[j]>arr[j+1])
j++;
if(arr[i]<arr[j])
break;
swap(arr[i],arr[j]);
}
}
void MakeHeap(int arr[],int n) {
int i=0;
for(int i=n/2-1; i>=0; i--) {
AdjustDown(arr,i,n);
}
}
void HeapSort(int arr[],int len) {
int i=0;
MakeHeap(arr,len);
for(int i=len-1; i>=0; i--) {
swap(arr[i],arr[0]);
AdjustDown(arr,0,i);
}
}
int main() {
int a[]= {8,5,0,3,7,1,2};
P(a,7);
HeapSort(a,7);
P(a,7);
return 0;
}
时间复杂度:O(nlog2n)
②建小堆(升序)
#include<iostream>
using namespace std;
void P(int a[],int n)
{
for(int i=0; i<n; i++)
cout<<a[i]<<" ";
cout<<endl;
}
void AdjustDown(int arr[],int i,int n) {
int j=i*2+1;
while(j<n) {
if(j+1<n&&arr[j]<arr[j+1])
j++;
if(arr[i]>arr[j])
break;
swap(arr[i],arr[j]);
}
}
void MakeHeap(int arr[],int n) {
int i=0;
for(int i=n/2-1; i>=0; i--) {
AdjustDown(arr,i,n);
}
}
void HeapSort(int arr[],int len) {
int i=0;
MakeHeap(arr,len);
for(int i=len-1; i>=0; i--) {
swap(arr[i],arr[0]);
AdjustDown(arr,0,i);
}
}
int main() {
int a[]= {8,5,0,3,7,1,2};
P(a,7);
HeapSort(a,7);
P(a,7);
return 0;
}
插入排序
(1)直接插入排序
#include<stdio.h>
#include<iostream>
using namespace std;
void P(int a[],int n)
{
for(int i=0; i<n; i++)
cout<<a[i]<<" ";
cout<<endl;
}
void insertsort(int a[],int len) {
for(int i=1; i<len; i++) {
int tmp=a[i];
int j=i-1;
while(a[j]<tmp&&j>=0) {
a[j+1]=a[j];
j--;
}
a[j+1]=tmp;
}
}
int main() {
int a[]= {8,5,0,3,7,1,2};
P(a,7);
insertsort(a,7);
P(a,7);
return 0;
}
时间复杂度:O(n2/4) 最好:O(n)
(2)折半插入排序
#include<stdio.h>
#include<iostream>
using namespace std;
void P(int a[],int n) {
for(int i=0; i<n; i++)
cout<<a[i]<<" ";
cout<<endl;
}
void insertsort(int a[],int len) {
for(int i=1; i<len; i++) {
int tmp=a[i];
int start=0,end=i-1;
while(start<=end) {
int mid=(start+end)/2;
if(a[mid]<tmp) {
end=mid-1;
} else {
start=mid+1;
}
}
for(int j=i-1; j>=end; j--)
a[j+1]=a[j];
a[end+1]=tmp;
}
}
int main() {
int a[]= {8,5,0,3,7,1,2};
P(a,7);
insertsort(a,7);
P(a,7);
return 0;
}
时间复杂度:O(n)
(3)希尔排序
#include<stdio.h>
#include<iostream>
using namespace std;
void P(int a[],int n)
{
for(int i=0; i<n; i++)
cout<<a[i]<<" ";
cout<<endl;
}
void shellsort(int arr[],int len) {
int i,j;
int increment=len;
int key;
while(increment>1) {
increment=increment/3+1;
for(int i=increment; i<len; i++) {
key=arr[i];
j=i-increment;
while(j>=0) {
if(key>arr[j]) {
int tmp=arr[j];
arr[j]=key;
arr[j+increment]=tmp;
}
j=j-increment;
}
}
}
}
int main() {
int a[]= {8,5,0,3,7,1,2};
P(a,7);
shellsort(a,7);
P(a,7);
return 0;
}
归并排序
#include<stdio.h>
#include<iostream>
using namespace std;
void P(int a[],int n) {
for(int i=0; i<n; i++)
cout<<a[i]<<" ";
cout<<endl;
}
void mergearray(int a[],int first,int mid,int last,int temp[]) {
int i=first,j=mid+1;
int m=mid,n=last;
int k=0;
while(i<=m&&j<=n) {
if(a[i]<=a[j])
temp[k++]=a[i++];
else
temp[k++]=a[j++];
}
while(i<=m) {
temp[k++]=a[i++];
}
while(j<=m) {
temp[k++]=a[j++];
}
for(int i=0; i<k; i++) {
a[first+i]=temp[i];
}
}
void mergesort(int a[],int first,int last,int temp[]) {
if(first<last) {
int mid=(first+last)/2;
mergesort(a,first,mid,temp);
mergesort(a,mid+1,last,temp);
mergearray(a,first,mid,last,temp);
}
}
int main() {
int a[]= {8,5,0,3,7,1,2};
P(a,7);
int temp[10];
mergesort(a,0,6,temp);
P(a,7);
return 0;
}
时间复杂度:O(nlog2(n))