排序的总结

排序算法稳定性:在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。

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

/*
EazyChange
2016.06.12
Sort
C language
*/

/*
插入排序
思想:从第i个元素开始,前移到i+1中正确的位置上,前i个元素默认有序
最好情况n,最坏情况n2,稳定
*/
void InsertionSort_wrong(int data[], int n)
{
    int i = 0, j = 0;
    for (i = 1; i < n; i++)
    {
        int tmp = data[i];//记录当前值
        for (j = i; j > 0; j--)//从当前值开始向前遍历
        {
            if (data[j-1] > tmp)//记住,这样写是错的!增加了时间复杂度
            {
                data[j] = data[j-1];
                data[j-1] = tmp;
            }
        }
    }
}
void InsertionSort(int data[], int n)
{
    int i = 0, j = 0;
    for (i = 1; i < n; i++)
    {
        int tmp = data[i];
        for (j = i; j>0 && data[j - 1] > tmp; j--)//这步保证最好情况时间复杂度为n
        {
            data[j] = data[j-1];
        }
        data[j] = tmp;
    }
}

/*
选择排序
思想:每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置
最好情况n2,最坏情况n2,不稳定
*/

void SelectSort(int data[], int n)
{
    int i = 0, j = 0;
    int min_index = 0;//最小元素下表
    int min_num = 0;//最小元素值
    for (i = 0; i < n; i++)
    {
        min_num = data[i];
        for (j = i; j < n; j++)//循环为找到最小元素
        {
            if (data[j] <= min_num)
            {
                min_num = data[j];
                min_index = j;//并记录下标
            }
        }
        data[min_index] = data[i];//与第一个元素替换
        data[i] = min_num;
    }
}

/*
冒泡排序
思想:通过从开始遍历逐渐把最大的数放大末尾
最好情况n2,最坏情况n2,不稳定,因为有>=
*/
void BubbleSort(int data[], int n)
{
    int i = 0, j = 0;
    for (i = 0; i < n - 1; i++)
    {
        for (j = 0; j < n - 1 - i; j++)
        {
            if (data[j] >= data[j + 1])
            {
                int tmp = data[j];
                data[j] = data[j + 1];
                data[j + 1] = tmp;
            }
        }
    }
}

/*
快速排序
思想:右边找一个数放左边,左边找一个数放右边,最后赋中间值,产生一个中间值序列。再递归。
最好情况nlogn,最坏情况n2,不稳定
*/
void QuickSort(int data[], int left, int right)
{
    if (left < right)
    {
        int i = left, j = right;
        int tmp = data[left];
        while (i < j)//这一趟排序产生一个中间数的序列
        {
            while (i < j && data[j]>tmp)//从右边找到第一个小于tmp的数
            {
                j--;
            }
            if (i < j)//把那个数给第左边计数值
            {
                data[i++] = data[j];
            }
            while (i < j && data[i] < tmp)//从左边找到第一个大于tmp的数
            {
                i++;
            }
            if (i < j)//把那个数给右边计数值
            {
                data[j--] = data[i];
            }
        }
        data[i] = tmp;//再把中间值赋给何时的位置
        /*
        for (int k = 0; k < 11; k++)
        {
            printf("%d ", data[k]);
        }
        printf("\n");*/
        QuickSort(data, left, i - 1);//此时中间值在i的位置,从left到i-1再来一遍
        QuickSort(data, i + 1, right);//从i+1到right再来一遍
    }
}

int main(void)
{
    int mat[] = { 3, 2, 1, 4, 6, 15, 8, 9, 10, 13, 21 };
    //BubbleSort(mat, sizeof(mat) / sizeof(mat[0]));
    QuickSort(mat, 0, 10);

    return 0;
}

附上一个快速排序时间复杂度分析:http://book.51cto.com/art/201108/287089.htm

时间: 2024-10-12 14:29:07

排序的总结的相关文章

经典排序算法 - 冒泡排序Bubble sort

 原文出自于 http://www.cnblogs.com/kkun/archive/2011/11/23/bubble_sort.html 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第

算法 希尔排序

希尔排序 Shell Sort 介绍: 希尔排序(Shell Sort)也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高. 执行流程: 首先

算法 排序NB二人组 堆排序 归并排序

参考博客:基于python的七种经典排序算法     常用排序算法总结(一) 序前传 - 树与二叉树 树是一种很常见的非线性的数据结构,称为树形结构,简称树.所谓数据结构就是一组数据的集合连同它们的储存关系和对它们的操作方法.树形结构就像自然界的一颗树的构造一样,有一个根和若干个树枝和树叶.根或主干是第一层的,从主干长出的分枝是第二层的,一层一层直到最后,末端的没有分支的结点叫做叶子,所以树形结构是一个层次结构.在<数据结构>中,则用人类的血统关系来命名,一个结点的分枝叫做该结点的"

数字在排序数组中出现的次数

题目:统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4. 程序实现: import java.util.Scanner; public class Test38 { public static void main(String[] args) { /**  * 初始化数组,测试数据可以多种途径初始化  */   Scanner in = new Scanner(System.in); /*int[] a = 

算法 排序lowB三人组 冒泡排序 选择排序 插入排序

参考博客:基于python的七种经典排序算法   [经典排序算法][集锦]     经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两个记录序号同等,且两者在原无序记录中的先后秩序依然保持不变,则称所使用的排序方法是稳定的,反之是不稳定

C/C++算法竞赛入门经典Page11 例题1-5 三整数排序

题目:输入3个整数,从小到大排序后输出 样例输入: 20 7 33 样例输出: 7 20 33 首先,先声明三个整数a,b,c和一个临时变量t: int a,b,c,t;//1,b,c为三个整数,t为临时变量 输入三个整数: scanf("%d%d%d",&a,&b,&c); 进行3次if判断: 1.如果b>a,则a,b对调 2.如果c>a,则a,c对调 3.如果c>b,则b,c对调 代码: if(b>=a){ t=b; b=a; a=t

排序与查找

1.冒泡法排序 2.选择排序 3.二分法查找(有序数组) 4.无序数组(基本查找)

使用插件bootstrap-table实现表格记录的查询、分页、排序等处理

在业务系统开发中,对表格记录的查询.分页.排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这个bootstrap-table是一款非常有名的开源表格插件,在很多项目中广泛的应用.Bootstrap-table插件提供了非常丰富的属性设置,可以实现查询.分页.排序.复选框.设置显示列.Card view视图.主从表显示.合并列.国际化处理等处理功能,而且该插件同时也提供了一些不错的扩展功能,如移动行.移动列位置等一些特殊的功能,插件可

AC日记——双栈排序 洛谷 P1155

双栈排序 思路: 二分图染+模拟: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1005 #define maxm 2000005 int n,head[maxn],E[maxm],V[maxm],cnt,col[maxn]; int minn[maxn],ai[maxn],sta1[maxn],sta2[maxn],top1,top2; bool if_[maxn][maxn]; inline void in(

输入password登录到主界面,录入学生编号,排序后输出

n 题目:输入password登录到主界面,录入学生编号,排序后输出 n 1.  语言和环境 A.实现语言 C语言 B.环境要求 VC++ 6.0 n 2.  要求 请编写一个C语言程序.将若干学生编号按字母顺序(由小到大)输出. 程序的功能要求例如以下: 1)  输入password"admin",正确则进入主界面,错误则直接推出(exit(0)): 2)从键盘输入5个学生编号"BJS1001","BJS2001"."BJS1011&