美文网首页
不稳定排序算法

不稳定排序算法

作者: Hunter琼 | 来源:发表于2021-05-13 11:22 被阅读0次

一 简单选择排序算法

下图为简单选择排序的实现过程:


图片来自网络
 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 void SelectSort(int *data,int n){
  5 
  6   int k; // 找到最小元素的下标
  7   int temp;
  8   for(int i = 0; i < n - 1; i++){
  9 
 10       k = i;
 11 
 12       for(int j = i + 1; j < n; j++){
 13 
 14          if(data[k] >  data[j]) k = j;
 15       }
 16 
 17       if(k != i){
 18         temp = data[i];data[i] = data[k];data[k] = temp;
 19       }
 20 
 21   }
 22 
 int main(int argc,char *argv[]){
 27 
 28  int data[] = {5,2,3,1,4};
 29 
 30  SelectSort(data,4);
 31 
 32  for (int i = 0; i < 4;i++){
 33 
 34   printf("%d   ",data[i]);
 35 
 36  }
 37  return 0;
 38 
 39 }

二 希尔排序

希尔排序是对直接插入排序的改进,基本思想是:将整个序列分成若干个序列,然后对这些子序列进行直接插入排序,待有序时,对整体序列进行一次直接插入排序,时间复杂度为0(n^1.3)
例如:初始关键码 48 37 64 96 75 12 26 48(-) 54 3
设置增量 10/2 = 5 5/2 = 3 3/2 = 1

image.png
#include<stdio.h>
#include<stdlib.h>

void shellSort(int *data,int n,int delta[],int m){
  int temp,dk,j,k;

  for(int i = 0; i < m;i++ ){
     
     dk = delta[i];

     for( k = dk; k < n; k++ ){
         
     if(data[k] < data[k-dk]){
             temp = data[k];
             data[k] = data[k- dk];
         for( j = k - dk;j >=0 && temp < data[j];j-=dk){
                 data[j + dk]  = data[j];
         }

         data[j + dk] = temp;
    
     }

     }
  }
}

int main(int argc,char *argv[]){

 int data[] = {48,37,64,96,75,12,26,48,54,3};
 int  n = 10;
 int delta[] = {10/2,10/4,10/8};
 int m = 3;
 shellSort(data,n,delta,m);

 for(int i = 0;i < n; i++){
   printf("%d ",data[i]);
 }
 return 0;
}

3 快速排序

/// 快速排序 空间复杂度为0(log2n)
/// - Parameters:
///   - a: <#a description#>
///   - low: <#low description#>
///   - high: <#high description#>
func qulickSort(a: inout [Int], low:Int,high:Int){
    
    if low >= high {
        return
    }
    
    var i = low;
    var j = high;
    // 基准值
    let base = a[i];
    
    while i < j {
        // 从右边开始 找到一个比base小 然后交换
        while i < j && a[j] >= base {
            j -= 1
        }
        a[i] = a[j]
        
        // 从左边开始 找到比base大 然后进行交换
        while i < j && a[i] <= base {
            i += 1
        }
        a[j] = a[i]
        
    }
    
    a[i] = base
    // 左递归
    qulickSort(a: &a, low: low, high: i - 1)
    // 右递归
    qulickSort(a: &a, low: i + 1, high: high)
    
}

相关文章

  • 三大排序算法

    归并排序[稳定的排序算法] 递归实现 非递归实现 快速排序[不稳定的排序算法] 堆排序[不稳定的排序算法]

  • iOS常用算法

    一、排序算法 NSSortConcurrent 是高效的但不稳定的排序算法,例如:快速排序NSSortStable...

  • 2019年5月份找工作面试知识点总结

    面试知识点 算法和数据结构 常用算法排序算法各种排序算法的时间复杂度,是否稳定内部排序快速排序 nlgn 不稳定冒...

  • 调整数组顺序使奇数在前java

    排序算法稳定性 冒泡:稳定 选择:不稳定 插入:稳定 快排:不稳定 归并:稳定 shell:不稳定 堆排序:不稳定...

  • 选择排序

    选择排序与插入排序的思想是比较象近,主要区别算法的稳定性。选择算法是不稳定的,不稳定

  • 排序算法

    排序算法 基本方法,交换和比较: 选择排序 不稳定。{5,5,2}就不稳定。 插入排序 可稳定。等于不再交换,所以...

  • 数据结构

    Q:堆排序 A:1 堆排序算法(图解详细流程)2 堆排序 Q:排序算法时间复杂度与稳定性 选择排序为什么不稳定:举...

  • 快速排序算法

    快速排序算法是不稳定的排序算法。 快速排序算法是基于分治策略的一个算法。其基本思想是,对于输入的子数组 a[p:r...

  • 排序算法学习笔记

    插入排序 算法稳定、时间复杂度为n^2 冒泡排序 算法稳定,时间复杂度为n^2 选择排序 算法不稳定,时间复杂度为...

  • 01-选择排序(完成)

    选择排序(基本排序算法)—— 不稳定!!! 动态图: 一、概念: 原理:就是从需要排序(待排序 )的数据中选择最小...

网友评论

      本文标题:不稳定排序算法

      本文链接:https://www.haomeiwen.com/subject/szptjltx.html