选择、冒泡、插入、快速排序

选择排序:每次挑第i小的放第i位。

int* select(int* a,int n){
  for(int i=0;i<n-1;i++){
    for(int j=i+1;j<n;j++){
      if(a[i]>a[j]){
        int temp=a[i];
        a[i]=a[j];
        a[j]=temp;
      }
    }
  }
  return a;
}

冒泡排序:每次挑第i大的放最后第i位(大数后置)。

int* bubble(int* a,int n){
   for(int i=0;i<n-1;i++){
      for(int j=0;j<n-1-i;j++){
        if(a[j]>a[j+1]){
          int temp=a[j];
          a[j]=a[j+1];
          a[j+1]=temp;
        }
      }
   }
   return a;
}

插入排序:打牌。

int *insert(int* a,int n){
  int *b=new int[n];
  b[0]=a[0];
  for(int i=1;i<n;i++){
     if(a[i]>=b[i-1])
      b[i]=a[i];
    else{
      int m=i-2;
      while((m>=0)&&(a[i]<b[m])){
      m--; //注意考虑m越出左边的情况
      }
      for(int j=i;j>m+1;j--)
        b[j]=b[j-1];
        b[m+1]=a[i];
    }
  }
  return b;
  delete[]b;
}

数值交换:

void swap(int &a,int&b){
  int temp=a;
  a=b;
  b=temp;
}

快速排序:左小右大,j记录遇到的小值数,大数交换置前。

void quick(int *a,int start,int end){
  if(end<=start) return;
  int key=a[start];
  int j=start;
  for(int i=start;i<=end;i++){
    if(a[i]<key){
      ++j;
      swap(a[i],a[j]);
    }
  }

  swap(a[start],a[j]);
  quick(a,start,j-1);
  quick(a,j+1,end);
}

原文地址:https://www.cnblogs.com/huangshan/p/3386486.html