算法基础之排序

排序是生活中经常面对的问题,而根据排序过程中借助的主要操作,我们把内排序分为:插入排序、交换排序、选择排序和归并排序。这些都是比较成熟的排序算法,我们学习这些排序算法主要目的是通过学习它们来提高我们编写算法的能力,以便于解决更多复杂和灵活的应用性问题。

冒泡排序(Bubble Sort)

基本思想:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。

算法实现:

void bubbleSort(sqList *list)
{
    int i, j;
    int flag = TRUE;
    for(i=1; i<list->length && flag; i++)
    {
        flag = FLASE;
        for(j=list->length-1; j>=i; j--)
        {
           if(list->r[j] > list->r[j+1])
           {
                swap(list, j, j+1);
                flag = TRUE;                   /*如果没有数据交换,说明已经有序,避免无意义的循环判断*/
           }
        }
    }
}

简单选择排序(Simple Selection Sort)

基本思想:通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换之。

算法实现:

void selectSort(sqList *list)
{
    int i, j, min;
    for(i=1; i<list->length; i++)
    {
        min = i;
        for(j=i+1; j<=list->length; j++)
        {
             if(list->r[min] > list->r[j])
                 min = j;
        }
        if(i != min)
            swap(list, i, min);
    }
}

直接插入排序(Strairht Insertion Sort)

基本思想:将一个记录插入的已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。

算法实现:

void insertSort(sqList *list)
{
    int i, j;
    for(i=2; i<=list->length; i++)
    {
        if(list->r[i] < list->r[i-1])        /*需要插入*/
        {
            list->r[0] = list->r[i];        /*设置哨兵*/
            for(j=i-1; list->r[j]>list->r[0]; j--)
            {
                list->r[j+1] = list->r[j];        /*记录后移*/
            }
            list->r[j+1] = list->r[0];        /*插入到正确位置*/
        }
    }
}

希尔排序(Shell Sort)

基本原理:将待排序的记录分割成若干子序列,使子序列记录个数较少,然后再这些子序列内分别进行直接插入排序,当整个序列都基本有序时,再对全体记录进行一次直接插入排序。其中分割策略是将相聚某个“增量”的记录组成一个子序列,以保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序。

而对于增量的选取,目前还是一个数学难题,迄今为止还没有一种最好的增量序列。另外由于记录是跳跃式的移动,希尔排序并不是一种稳定的排序算法。

快速排序(Quick Sort)

基本思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的记录小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

算法实现:

void quickSort(sqList *list)
{
    qsort(list, 1, list->length);
}

void qsort(sqList *list, int low, int high)
{
    int pivot;
    if(low < high)
    {
        pivot = partition(list, low, high); /*一分为二,算出枢纽值*/
        qsort(list, low, pivot-1); /*对低子表递归排序*/
        qsort(list, pivot+1, high); /*对高子表递归排序*/
    }
}

int partition(sqList *list, int low, int high)
{
    int pivotkey;
    pivotkey = list->r[low]; /*用字表的第一个记录作枢纽值*/
    while(low < high) /*从表的两端交替向中间扫描*/
    {
        while(low<high && list->r[high] >= pivotkey)
            high--;
        swap(list, low, high); /*将比枢纽值小的记录交换到低端*/
        while(low<high && list->r[low] <= pivotkey)
            low--;
        swap(list, low, high); /*将比枢纽值大的记录交换到高端*/
    }
    return low; /*返回枢纽值所在位置*/
}

快速排序优化:

1.优化选取枢纽值:三数取中。

2.优化不必要的交换

3.优化小数组的排序方案

4.优化递归操作

时间: 2024-10-14 11:10:16

算法基础之排序的相关文章

算法基础之排序(2)--选择排序 改进

1 /********************************************************************************************************** 2 * Function : test 3 * Create Date : 2014/03/23 4 * Author : NTSK13 5 * Email : [email protected] 6 * Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性

算法基础之排序(1)--冒泡排序 改进

1 /********************************************************************************************************** 2 * Function : test 3 * Create Date : 2014/03/23 4 * Author : NTSK13 5 * Email : [email protected] 6 * Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性

算法基础:排序与查找

1.直接插入排序 1.1.基本思想: 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的:如此反复循环,直到全部排好顺序. 1.2.实现思路: INSERTION_SORT(A) for i = 2 to n j = i-1 key = A[i] while j > 0 && A[j] > key A[j+1] = A[j] j-- A[j+1] = key 1.3.算法实现: pub

算法基础--快排序,堆排序,归并排序

这是笔记; 快速排序的思想:先说一趟划分:一个数组a[0...(length-1)],把数组的第一个元素当作枢轴v(是vlaue,不是下标),将数组中所有比k小的元素都移动到k的左侧,将所有比v大的元素都移动到元素的右边. 我们需要得到一个数组划分后,枢轴v现在的位置下标(这是下一步进行划分的边界); 长度为n的数组,平均需要log(n)次划分. 代码实现: 1 ///quick sort 2 void quick_sort(int a[],int s,int t){//这是算法的开始,我们看到

算法基础——1.排序

排序算法 交换排序类:冒泡排序.快速排序 选择排序类:简单选择排序.堆排序 插入排序类:直接插入排序.希尔排序 冒泡排序 冒泡排序(Bubble Sort),排序的基本思想为两两比较小相邻数据的关键字,如果顺序为反则进行交换,直到没有反序的记录为止. 冒泡排序有多种变化,其三种不同实现的代码如下: //OS:Win | Terminal:Cmder | Editor:Atom | Language:c void Swap(int *a , int *b){ int temp = *a; *a =

数据结构算法基础-内部排序算法

1 arr = [1,23,12,9,8,8,9,1,1,8,] 2 def quickSortCore(arr,start,end): 3 if start < end: 4 index = partition(arr,start,end) 5 quickSortCore(arr,start,index-1) 6 quickSortCore(arr,index+1,end) 7 8 def partition(arr,start,end): 9 key = arr[start] 10 whil

算法基础——经典八大排序算法的Java及Python实现

概述 八大排序算法不用多说了,程序员算法基础必须要掌握的,现在总结一下加深记忆.下图是这八大排序算法的分类.名称.时间空间复杂度,以及稳定性. 代码 以下是经典八大排序算法的Java及Python代码,都是基于经典算法书籍<算法导论>里的伪代码实现的,我在关键语句部分附上了注释. 按照上图中的顺序分别介绍八大排序算法的实现(升序),前面是Java,后面是Python.Java的排序函数写在了一个类里,Python的排序函数则直接写出来了. 直接插入排序 public class InsertS

0基础学算法 第二弹 排序

大家好啊,这是0算法基础学算法系列第二篇,上次我在第一弹里讲了关于流程图的内容,我寻思着,这次讲些什么好呢,于是我决定,教大家一个很基础的算法,那就是排序,排序有很多方法,如果你有更多方法请在评论区里留言哦. 排序在程序中特别实用,常用的有快速排序,桶排序,冒泡排序,插入排序等等,在这里我不建议使用冒泡排序或者插入排序,建议桶排序和快速排序,这两个排序非常实用,时间复杂度低,理解起来也很容易,首先,你先思考一下,怎么用程序进行排序,然后你再来看看你的思路合理不合理,最后试着用程序实现它,实现后你

冒泡、选择、插入排序算法——基础排序算法详解。

冒泡排序 大(小)的数慢慢“浮”到队列尾端. 原理(步骤): 第一步:比较相邻两数,从小到大排序时,第一个数大于第二个数时,交换两数位置, 第二步:接着对数列中第二对(第二个数和第三个数)重复第一步操作,比完所有数之后最大(小)的数已经在最右边.第一轮结束. 第三步:针对除最后一个数外的数重复一.二步(排完剩下的最后一个数就已经有序). 时间复杂度:(N-1)+(N-2)+...+1 = N*(N-1)/2 复杂度为O(N2). Java实现: public static int[] Bulle