c++中八大排序算法

2020-01-06 15:52:04王冬梅

 


void print(int a[], int n){ 
  for(int j= 0; j<n; j++){ 
    cout<<a[j] <<" "; 
  } 
  cout<<endl; 
} 
 
void swap(int *a, int *b) 
{ 
  int tmp = *a; 
  *a = *b; 
  *b = tmp; 
} 
 
int partition(int a[], int low, int high) 
{ 
  int privotKey = a[low];         //基准元素 
  while(low < high){          //从表的两端交替地向中间扫描 
    while(low < high && a[high] >= privotKey) --high; //从high 所指位置向前搜索,至多到low+1 位置。将比基准元素小的交换到低端 
    swap(&a[low], &a[high]); 
    while(low < high && a[low] <= privotKey ) ++low; 
    swap(&a[low], &a[high]); 
  } 
  print(a,10); 
  return low; 
} 
 
 
void qsort_improve(int r[ ],int low,int high, int k){ 
  if( high -low > k ) { //长度大于k时递归, k为指定的数 
    int pivot = partition(r, low, high); // 调用的Partition算法保持不变 
    qsort_improve(r, low, pivot - 1,k); 
    qsort_improve(r, pivot + 1, high,k); 
  }  
}  
void quickSort(int r[], int n, int k){ 
  qsort_improve(r,0,n,k);//先调用改进算法Qsort使之基本有序 
 
  //再用插入排序对基本有序序列排序 
  for(int i=1; i<=n;i ++){ 
    int tmp = r[i];  
    int j=i-1; 
    while(tmp < r[j]){ 
      r[j+1]=r[j]; j=j-1;  
    } 
    r[j+1] = tmp; 
  }  
 
}  
 
 
 
int main(){ 
  int a[10] = {3,1,5,7,2,4,9,6,10,8}; 
  cout<<"初始值:"; 
  print(a,10); 
  quickSort(a,9,4); 
  cout<<"结果:"; 
  print(a,10); 
 
} 

7. 归并排序(Merge Sort)

基本思想:

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

归并排序示例:
八大排序算法,c++,八大排序算法总结,排序算法

 合并方法:

设r[i…n]由两个有序子表r[i…m]和r[m+1…n]组成,两个子表长度分别为n-i +1、n-m。

1.j=m+1;k=i;i=i; //置两个子表的起始下标及辅助数组的起始下标

2.若i>m 或j>n,转⑷ //其中一个子表已合并完,比较选取结束

3.//选取r[i]和r[j]较小的存入辅助数组rf

如果r[i]<r[j],rf[k]=r[i]; i++; k++; 转⑵

否则,rf[k]=r[j]; j++; k++; 转⑵

4.//将尚未处理完的子表中元素存入rf

如果i<=m,将r[i…m]存入rf[k…n] //前一子表非空

如果j<=n ,  将r[j…n] 存入rf[k…n] //后一子表非空

5.合并结束。

 


//将r[i…m]和r[m +1 …n]归并到辅助数组rf[i…n] 
void Merge(ElemType *r,ElemType *rf, int i, int m, int n) 
{ 
  int j,k; 
  for(j=m+1,k=i; i<=m && j <=n ; ++k){ 
    if(r[j] < r[i]) rf[k] = r[j++]; 
    else rf[k] = r[i++]; 
  } 
  while(i <= m) rf[k++] = r[i++]; 
  while(j <= n) rf[k++] = r[j++]; 
}