排序汇总

几种简单排序算法实现

简单选择排序

1
2
3
4
5
6
7
8
9
10
11
12

void simpleRank(vector<int> R){
        int s;
        for(int i=0;i<R.size();i++){
            s=0;
            for(int j=i+1;R.size();j++){
                if(R[j]<R[s])s=j;
            }
            swap(R[i],R[s]);
        }

    }

时间复杂度O(n2 ),是不稳定的排序算法。空间复杂度为O(n)

直接插入排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   void InsertRank(vector<int> R){
  
     for(int i=1;i<R.size();i++){
      int tmp=R[i];
      int j=i;
      while(j>0&&tmp<R[j-1]){
          R[j]=R[j-1];j--;
      }
      R[j]=tmp;
  }
  
    }
    ```
当原始数据是有序的,直接插入排序最好的时间复杂度是On)最坏情况为On^2 ),是稳定的排序算法。空间复杂度为On

##冒泡排序

cpp void maopaoRank(vector R){ int j=R.size()-1; while(j>0){ int last=0; for(int i=0;i<j;i++){ if(R[i]>R[i+1]){swap(R[i],R[i+1]); last=i;} } j=last; } }

1
2
3
注意并不是一定要进行R.size()趟,当没有交换的元素的时候就可以结束循环了。当原始数据是有序的,直接插入排序最好的时间复杂度是On)最坏情况为On^2 ),是稳定的排序算法。需要额外的栈资源。

##快速排序

cpp //函数封装 void QuickSort(vector R){ Quick(R,0,R.size()-1); } void Quick(vector R, int left,int right){ int i,j; if(left<right){//待排元素多于一个 i=left; j=right+1; do{ do i++;while(R[i]<R[left]);//寻找第一个大于R[left]的元素 do j–;while(R[j]>R[left]);//寻找第一个小于R[left]的元素 if(i<j)swap(R[i],R[j]);//交换元素,如果此时i>j久不用交换了 }while(i<j); swap(R[left],R[j]); Quick(R,left,j-1);//低端 Quick(R,j,right);//高端 }}

1
2
3
4
5
6
7
8
9
10
11
快速排序有三种选择分割点的方法:

1. A[(left+right)/2]作为分割点,与第一个点交换
2. 取随机数与第一个点交换
3. 比较A[left],A[right],A[(left+right)/2],取中间的和第一个点交换。

优化方法:先排短的子序列,再排长的子序列。

时间复杂度:平均情况O(nlogn),最坏情况为O(n^2).快速排序是不稳定的排序算法。

##二路合并排序

cpp include using namespace std; int * Merge(){ }

```