冒泡,插入,折半插入,希尔,快速,简单选择排序的源代码总结

#include <iostream>
using namespace std;
//各种排序方法:
/**冒泡排序法**/
//它的时间复杂度为O(n^2),虽然不及堆排序、快速排序的O(nlogn,底数为2),但是有两个优点:1.“编程复杂度”很低,很容易写出代码;2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,而堆排序、快速排序均不具有稳定性。
void Bubble_sort(int s[],int len){
    int i,j,flag;
    for (i=len-1; i>=1; i--) {
        flag=1;
        for (j=i-1; j>=0; j--) {
            if (s[i]<s[j]) {
                swap(s[i], s[j]);
                flag=0;
            }
        }
        if (1==flag) {//表示已经排序完成
            break;
        }
    }
}
/**插入排序法**/
//插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。
void Insert_sort(int s[],int len){ 
    int i,j;
    int temp;
    for(i=1;i<len;i++){
        temp=s[i];
        for (j=i; j>0&&temp<s[j-1]; j--) {
            s[j]=s[j-1];
        }
        s[j]=temp;
    }
}
/**折半插入排序法**/
//当第i个元素要进行排序的时候,它前面的1到i-1位置上的数据是局部有序的,对于有序的数据序列,采用折半查找法去判断在何处插入i位置上的数据,就大大减少了需要比较的次数。
void HalfInsert_sort(int s[], int len){
    int temp, low, high, i, j, mid;
    for (i=1; i<len; ++i)
    {
        temp = s[i];
        low = 0;
        high = i - 1;
        
        while (high >= low)
        {
            mid = (low + high) / 2;
            
            if (temp < s[mid])
            {
                high = mid - 1;
            }
            
            else
            {
                low = mid + 1;
            }
        }
        
        for (j=i-1; j>=low; --j)
        {
            s[j+1] = s[j];
        }
        
        s[low] = temp;
    }
}

/**希尔排序法**/
//希尔排序法(缩小增量法) 属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序的方法。
void Hill_sort(int s[],int len){
    int h,j,k,t;
    for (h=len/2; h>0; h=h/2) {//控制增量
        for (j=h;j<len; j++) {
            t=s[j];
            for (k=j-h; k>=0&&t<s[k]; k-=h) {
                s[k+h]=s[k];
            }
            s[k+h]=t;
        }
    }
}

/**快速排序法**/
//快速排序(Quicksort)是对冒泡排序的一种改进。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
//挖坑法
void quick_sort1(int s[],int l, int r){
    int i=l;
    int j=r;
    int x=s[i];//第一个坑
    if(i>=j) return ;
    while (i!=j) {
        //从右向左找小于x的数来填s[i];
        while (i<j&&s[j]>=x) {
            j--;
        }
        s[i]=s[j];
        //从左向右找大于或等于x的数来填s[j];
        while (i<j&&s[i]<x) {
            i++;
        }
        s[j]=s[i];
    }
    s[i]=x;
    quick_sort1(s, l, i-1);
    quick_sort1(s, i+1, j); 
}
/**简单选择排序法**/
//选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾(目前已被排序的序列)。以此类推,直到所有元素均排序完毕。
void Select_sort(int s[], int len){
    int i,j,min;
    for (i=0; i<len-1; i++) {
        min=i;
        for (j=i+1; j<len; j++) {
            if (s[min]>s[j]) {
                min=j;//把值最小的下标记下来
            }
        }
        if (min!=i) {
            swap(s[i], s[min]);
        }
    }
}

//输出
void prain(int s[],int len){
    for (int i=0; i<len; i++) {
        cout<<s[i]<<" ";
    }
    cout<<endl;
}
int main(int argc, const char * argv[])
{

    //从小到大排序
    int s[]={10,1,4,2,3,8,7,6,5,9};
    int len=sizeof(s)/sizeof(int);
    /**起泡排序法**/
    Bubble_sort(s,len);
    cout<<"冒泡法:";
    prain(s, len);
    cout<<endl;
    
    /**插入排序法**/
    int s1[]={10,1,4,2,3,8,7,6,5,9};
    int len1=sizeof(s1)/sizeof(int);
    Insert_sort(s1,len1);
    cout<<"插入法:";
    prain(s1, len1);
    cout<<endl;
    
    /**希尔排序法**/
    int s2[]={10,1,4,2,3,8,7,6,5,9};
    int len2=sizeof(s)/sizeof(int);
    Hill_sort(s2,len2);
    cout<<"希尔排序法:";
    prain(s2, len2);
    cout<<endl;
    
    /**快速排序法**/
    int s3[]={10,1,4,2,3,8,7,6,5,9};
    int len3=sizeof(s)/sizeof(int);
    Insert_sort(s3,len3);
    
    /**简单选择排序法**/
    int s4[]={10,1,4,2,3,8,7,6,5,9};
    int len4=sizeof(s)/sizeof(int);
    Select_sort(s4,len4);
    cout<<"简单选择排序法:";
    prain(s4, len4);
    cout<<endl;
    
    /**折半插入排序法**/
    int s5[]={10,1,4,2,3,8,7,6,5,9};
    int len5=sizeof(s)/sizeof(int);
    HalfInsert_sort(s5,len5);
    cout<<"折半插入法:";
    prain(s5, len5);
    cout<<endl;
    
    return 0;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是七种排序算法的介绍和示例: 1. 直接插入排序(Insertion Sort): 直接插入排序是一种简单直观的排序算法,它的基本思想是将待排序的元素按照大小插入到已排序的序列中的适当位置。具体步骤如下: ```python def insertion_sort(arr): for i in range(1, len(arr)): key = arr[i] j = i - 1 while j >= 0 and arr[j] > key: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key arr = [5, 2, 8, 12, 7] insertion_sort(arr) print(arr) # 输出:[2, 5, 7, 8, 12] ``` 2. 折半插入排序(Binary Insertion Sort): 折半插入排序是对直接插入排序的一种改进,它通过使用二分查找来减少比较次数。具体步骤如下: ```python def binary_insertion_sort(arr): for i in range(1, len(arr)): key = arr[i] left = 0 right = i - 1 while left <= right: mid = (left + right) // 2 if arr[mid] > key: right = mid - 1 else: left = mid + 1 for j in range(i - 1, left - 1, -1): arr[j + 1] = arr[j] arr[left] = key arr = [5, 2, 8, 12, 7] binary_insertion_sort(arr) print(arr) # 输出:[2, 5, 7, 8, 12] ``` 3. 希尔排序(Shell Sort): 希尔排序是一种插入排序的改进算法,它通过将待排序的序列分割成若干个子序列,对子序列进行插入排序,最后再对整个序列进行一次插入排序。具体步骤如下: ```python def shell_sort(arr): n = len(arr) gap = n // 2 while gap > 0: for i in range(gap, n): temp = arr[i] j = i while j >= gap and arr[j - gap] > temp: arr[j] = arr[j - gap] j -= gap arr[j] = temp gap //= 2 arr = [5, 2, 8, 12, 7] shell_sort(arr) print(arr) # 输出:[2, 5, 7, 8, 12] ``` 4. 冒泡排序(Bubble Sort): 冒泡排序是一种简单的排序算法,它重复地遍历待排序的序列,每次比较相邻的两个元素,如果顺序错误就交换它们,直到没有需要交换的元素为止。具体步骤如下: ```python def bubble_sort(arr): n = len(arr) for i in range(n - 1): for j in range(n - 1 - i): if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] arr = [5, 2, 8, 12, 7] bubble_sort(arr) print(arr) # 输出:[2, 5, 7, 8, 12] ``` 5. 快速排序(Quick Sort): 快速排序是一种高效的排序算法,它通过选择一个基准元素,将序列分割成两部分,一部分小于基准元素,一部分大于基准元素,然后对两部分递归地进行快速排序。具体步骤如下: ```python def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) arr = [5, 2, 8, 12, 7] arr = quick_sort(arr) print(arr) # 输出:[2, 5, 7, 8, 12] ``` 6. 简单选择排序(Selection Sort): 简单选择排序是一种简单直观的排序算法,它的基本思想是每次从待排序的序列中选择最小(或最大)的元素,放到已排序序列的末尾。具体步骤如下: ```python def selection_sort(arr): n = len(arr) for i in range(n - 1): min_index = i for j in range(i + 1, n): if arr[j] < arr[min_index]: min_index = j arr[i], arr[min_index] = arr[min_index], arr[i] arr = [5, 2, 8, 12, 7] selection_sort(arr) print(arr) # 输出:[2, 5, 7, 8, 12] ``` 7. 归并排序(Merge Sort): 归并排序是一种分治算法,它将待排序的序列分成两个子序列,对每个子序列进行递归地归并排序,然后将两个有序的子序列合并成一个有序的序列。具体步骤如下: ```python def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left = merge_sort(arr[:mid]) right = merge_sort(arr[mid:]) return merge(left, right) def merge(left, right): result = [] i = j = 0 while i < len(left) and j < len(right): if left[i] < right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 result.extend(left[i:]) result.extend(right[j:]) return result arr = [5, 2, 8, 12, 7] arr = merge_sort(arr) print(arr) # 输出:[2, 5, 7, 8, 12] ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值