几种排序算法比较


排序对比图

一、交换排序:

1、冒泡算法:

​核心:相邻比大小,交换

遍历length-1遍

每遍的子遍历遍历length-i遍(第1遍时,i=2)

Bubble_Sort(int &array[]){
​    for(i = 1; i<length-1,i++){
        for(j = 0; j<length-i; j++){             //第1遍时,i为2
            if array[j] >array[j+1]{
                  int help = array[j];
                  array[j] = array[j+1];
                  array[j+1] = help;
           }
        }        
    }
}

.
.

2、快速排序:

核心:将序列排好,分解为子序列,子序列继续排列,排列完的子序列继续分自身的子序列
特点:在同一个数组上排序,无需格外数组,不断排序

(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

void split(int &array,[] int start, int end){
    int key = quicksort(start, end);
    split(stat, key-1);
    split(key+1, end );
}

void quicksort(int &array[], int start, int end){
    key = array[start];
    
    while(start != end && start != end+1){
        while (array[end] >= key && start<end) 
            end--;
        if(start < end) 
            array[start++] = array[end];                //引用后再加1;
        while(array[start] > key && start <end) 
            start++;
        if(start < end)
            array[end-- ] = array[start];               //引用后再减1;
    }
        array[start] = key;                             //退出时start == end, 讲基准数放入坑中 
        return key;
}

.
.

更加简洁的代码:

void quick_sort(int s[], int l, int r){
    if (l < r)
    {
        //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
        int i = l, j = r, x = s[l];
        while (i < j)
        {
            while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
                j--;  
            if(i < j) 
                s[i++] = s[j];
            
            while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数
                i++;  
            if(i < j) 
                s[j--] = s[i];
        }
        s[i] = x;
        quick_sort(s, l, i - 1); // 递归调用 
        quick_sort(s, i + 1, r);
    }
}

//  此代码,  
    作者:MoreWindows
    原文:https://blog.csdn.net/morewindows/article/details/6684558 


.
.

二、插入排序

​思想:

  • 遍历 length-1遍“子遍历”
  • 每遍“子遍历”遍历 i 遍
insertion_sort(int &array[]){
    int i,j,help = 0;
    for(i = 0; i<length-1; i++){
        j = i;                            //第1遍时,j=1;
        while(j > 0){
            if(array[j] < array[j-1]){
                help = array[j];
                array[j] = array[j-1];      
                array[j-1] = array[j];
            }     
        }
    }
}

.
.

三、选择排序:

思想:

  • 从小到大排序,从左往右遍历,每次遍历,flag = “子遍历的首位数下标”,“子遍历”每次找到比flag小的数,就记录其下标flag = 下标;
  • 子遍历结束,子遍历的首位数 与 数组flag标记位置交换
Selection_sort(int &array[]){
    for(int i = 0; i<array.length-2; i++ ){
        int  flag = i-1;
        for(int j = i; j<length-2; j++){                              //第1遍时,j = 1;
            if(array[flag] > array[j]) flag = j;
        }
        int help = array[i-1];
        array[i-1] = array[flag];
        array[flag] = help;    
    }
}

.
.

四、归并排序

思想

  • 归并算法与快速排序相反,是把顺序的子序列给合并起来,再排序
  • 需要借助格外数组
  • 稳定

//排序获取的两个子数组
void Sort(int &array[],int start,int middle,int end){  
    if()
    int help[] = new int[];
    int i =start,j = middle+1,z = 0;
    
    while(i != middle+1 && j != end+1;){           //比较数据并且交换
        if(array[i] <= array[j]){
            help[z] = array[i];
            i++;
        }
        else{
            help[z] = array[j];
            j++;
        }

        z++;
    }
    
    if(i != middle+1){                              //help数组追加数组后面较大的数据
        while(i != middle+1){
            help[z] = array[i];
            i++;
        }
    }
    else if(j != end+1){
         while(i != middle+1){
            help[z] = array[j];
            j++;
        }
    }
    
    z = 0;                                          //help数组导入array数组
    while(start != end+1){
        array[start] = help[z];
        start++;
    }
}
//开始归并排序函数;递归合并子数组
//若数组数为偶数,中间数偏左
void Merge(int &array[],int start,int end){         
    int middle = (end + start)/2;                                 
    Merge(&array,start, middle);                     //数组数为偶数,左数组数比右数数组多1
    Merge(&array,middle+1, end);
    Sort(&array,start, middle,end)
}     


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM