一 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 ;
}
}
}
}
二 O(n×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){
//查找的过程中保证i和j不会交叉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);//合并数组
}
}