O(n^2)
选择排序
冒泡排序
插入排序
#include<iostream>
#include<cstring>
using namespace std;
void swap(int &a,int &b){
int t=a;
a=b;
b=t;
}
void bubble_sort(int *array,int size){
int flag=1;
for(int i=1;flag && i<size;i++){
flag=0;
for(int j=0;j<size-i;j++){
if(array[j]>array[j+1]){
swap(array[j],array[j+1]);
flag=1;
}
}
}
}
void insert_sort(int *array,int size){
int x;
for(int i=1,j;i<size;i++){
x=array[i];
for(j=i;j>0 && array[j-1]>x;j--){
array[j]=array[j-1];
}
array[j]=x;
}
}
void select_sort(int *array,int size){
int min_shu,min_i;
for(int i=0;i<size-1;i++){
min_shu=array[i];
min_i=i;
for(int j=i+1;j<size;j++){
if(array[j]<min_shu){
min_shu=array[j];
min_i=j;
}
}
if(min_i-i) swap(array[i],array[min_i]);
}
}
int main(){
int array[6]={19,54,4,30,70,2};
//从小到大排序
// insert_sort(array,6);
// bubble_sort(array,6);
select_sort(array,6);
for(int i=0;i<6;i++){
cout<<array[i]<<" ";
}
return 0;
}
O(n*logn)
堆排序
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
void test01(){
vector<int>q={1,2,3,4,5,6};
vector<int>a;
make_heap(q.begin() ,q.end() );
for (int x : q)
cout << x << " ";
cout<<"------------"<<endl;
for(int i=0;i<6;i++){
pop_heap(q.begin() ,q.end() );
a.push_back(q.back());
q.pop_back() ;
}
for (int x : a)
cout << x << " ";
}
void test02(){
priority_queue<int>q;
q.push(1),q.push(2), q.push(3), q.push(4),q.push(5),q.push(6);
vector<int>a;
while(!q.empty() ){
a.push_back(q.top() );
q.pop() ;
}
for(auto x:a)
cout<<x<<" ";
}
void swap(int &a,int &b){
int t=a;
a=b;b=t;
}
void down(int k,int *array,int size){
int x=array[k];
int i,child;
for(i=k;i*2+1<=size-1;i=child){
child=i*2+1;
if(child<size-1 && array[child+1]>array[child]) child++;
if(x<array[child])
array[i]=array[child];
else break;
}
array[i]=x;
}
void heap_sort(int *array,int size){
for(int i=size/2-1;i>=0;i--){
down(i,array,size);
}
for(int i=size-1;i>0;i--){
swap(array[0],array[i]);
down(0,array,i);
}
}
void test03(){
int array[6]={11,2,33,44,55,6};
heap_sort(array,6);
for(auto x:array)
cout<<x<<" ";
}
int main(){
// test01();
// test02();
test03();
return 0;
}
归并排序
#include<iostream>
using namespace std;
void merge(int *a,int *t,int li,int ri,int re){
int ti=li;
int begin=li;
int le=ri-1;
while(li<=le && ri<=re){
if(a[li]<=a[ri]) t[ti++]=a[li++];
else t[ti++]=a[ri++];
}
while(li<=le) t[ti++]=a[li++];
while(ri<=re) t[ti++]=a[ri++];
for(int i=begin;i<=re;i++){
a[i]=t[i];
}
}
void msort(int *array,int *t,int left,int right){
if(left>=right) return;
int mid=(left+right)/2;
msort(array,t,left,mid);
msort(array,t,mid+1,right);
merge(array,t,left,mid+1,right);
}
void merge_sort(int *array,int n){
int *t;
t=(int*)malloc(sizeof(int)*n);
msort(array,t,0,n-1);
free(t);
}
void print(int *a,int n){
for(int i=0;i<n;i++){
cout<<a[i]<<endl;
}
}
int main(){
int array[6]={11,222,33,4,66,-1};
merge_sort(array,6);
print(array,6);
return 0;
}
快速排序
书中的方式cutoff>=3才能使用,因为有i=left+1,以及j=right-2否则数组越界,
所以编程题目不用,函数题不知道考不考,写一下部分函数吧
int mid(int *a,int left,int right){
int mid=(left+right)/2;
if(a[left]>a[mid]) swap(a[left],a[mid]);
if(a[left]>a[right]) swap(a[left],a[right]);
if(a[mid]>a[right]) swap(a[mid],a[right]);
swap(a[mid],a[right-1]);
return a[right-1];
}
void q_sort(int *a,int left,int right){
int p;
if(right-left<cutoff){
insert_sort(a+left,right-left+1);
}
else{
p=mid(a,left,right);
int i=left+1;
int j=right-2;
while(1){
while(a[i]<p) i++;
while(a[j]>p) j--;
if(i<j) swap(a[i],a[j]);
else break;
}
swap(a[i],a[right-1]);
q_sort(a,left,i-1);
q_sort(a,i+1,right);
}
}
再写一下实验题,比较通用的快排
不知道是不是没午睡比较晕,好一会才理解
~~
#include<iostream>
using namespace std;
int a[1010];
int n;
void print(){
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
void q_sort(int l,int r)
{
if(l>r) return;//不能加=
int i=l+1,j=r,p=a[l];
while(1)//一定是从j开始的
{
while(a[j]>=p&&i<j) j--;
while(a[i]<=p&&i<j) i++;
if(i<j) swap(a[i],a[j]);
else break;
}
swap(a[j],a[l]);
print();
q_sort(l,j-1);
q_sort(j+1,r);
}
int main(){
cin>>n;//n是全局变量的话,不能改变n--错的
for(int i=1;i<=n;i++){
cin>>a[i];
}
q_sort(1,n);
return 0;
}