排序算法总结

一      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);//合并数组

}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值