排序算法总结

来源:互联网 发布:mac的option是windows 编辑:程序博客网 时间:2024/06/06 01:30

一     O(n×n)的算法

       1.冒泡排序

         基本思想:冒泡排序的基本思想就是第i轮(i=n-1)从前到后(或者从后向前)的扫描n-i个数,每次都能够将前n-i个数中最大者“沉底”,(如果从后向前则表现为最小者“浮起来”)---所以我想这应该是冒泡排序的由来吧。

代码如下:

voidsort_mp(int a[],int n){ // a:待排序的数组   n:数组的长度
   for (int i = 0 ; i < n -1 ; ++ i){
           for (int j = 0 ; j < n-i-1 ; ++j){
             if (a[j]>a[j+1]){
             int t = a[j] ;
             a[j] = a[j+1] ;
             a[j+1] = t ;
             }
           }
    }
}

冒泡改进:

改进思路1:设置标志位,明显如果有一趟没有发生交换(flag= false),说明排序已经完成

改进思路2:记录一轮下来标记的最后位置,下次从头部遍历到这个位置就Ok

2.选择排序

基本思想:共n-1趟,每一趟(第i趟)从后n-i个数中选出最小值放在第i-1个位置

voidsort_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]){

intt = a[i] ;

a[i]= a[j] ;

a[j]= t ;

}

}

}


}


On×lgn)的算法


1.快速排序

基本思想:每次将数组分为两部分,前一部分都小于数t,后一部分都大于数t,以此递归下去。

voidsort_quick(int a[], int m,int n){ //该函数的功能是将数组中第m-n个数排序

cout<<"m= "<<m <<" n = "<<n <<endl;

if(m>=n)

return;

intt = a[m] ;//哨兵

inti = m , j = n ;

while(i<j){

//查找的过程中保证ij不会交叉i<j

while(i<j&&a[j]>=t) --j;

a[i]= a[j];

while(i<j&&a[i]<=t) ++i;

a[j]= a[i];

}

a[i]= t ;

sort_quick(a,m,i-1);

sort_quick(a,i+1,n);

}

2.归并排序(先递归再合并)

基本思想:先用sort_merge函数使数组部分有序,再利用merge函数将数组合并成整个有序。

举例: 16 5 4 sort_merge将数组一分为2– 1 6 54,然后让数组部分有序变成 16 45 。最后合并两个有序数组14 5 6,排序完成。

voidmerge(int a [], int m,int n){


intt[100] ;

intmid = (m+n)/2;

inti = m , j = mid+1;

intk = 0 ;

while(i<=mid && j<=n){

if(a[i]>a[j])

t[k++]= a[j++];

else

t[k++]= a[i++];

}

while(i<=mid) t[k++] = a[i++];

while(j<=n) t[k++] = a[j++];

for(i=0;i<k;++i)a[m+i] = t[i] ;

}


voidsort_merge(int a[], int left,int right){

if(right - left<=1){

if(a[left]>a[right]){

intt = a[left] ;

a[left]= a[right] ;

a[right]= t ;

}

}else{

intmid = (left+right) / 2 ;

sort_merge(a, left , mid) ;

sort_merge(a,mid+1,right);

merge(a,left,right);//合并数组

}

}


1 0
原创粉丝点击