简单选择排序和直接插入排序

简单选择排序

简单选择排序就是通过关键字之间的比较,在记录里面找到最小(或者最大)的数字,并同当前位置交换之。

贴个代码:

void SelectSort(SqList *L)
{
    int i, j, min;
    for (i = 0; i < L->length - 1; i++)
    {
        min = i;
        for (j = i + 1; j < L->length; j++)
        {
            if (L->r[min] > L->r[j])
            {
                 min = j;
            }
        }
        if (i != min)
            swap(L, i, min);
    }
}

分析一下:很显然,对于一个无序数组来说,把第一个数的下标暂且作为值最小的下标,然后通过与其后的数据对比,找出真正的最小的数组的下标,如果找到,就交换,如果没找到,说明当前数据是最小的,那么就不用交换。然后下标递增,再次比较。就这样实现排序。

复杂度分析:

我们知道,交换最多需要n - 1次(最少需要0次)。而第i次排序需要n - i 次比较,那么总共有 (n - 1) + (n - 2) +  (n - 3) +..... + 1 = n * (n - 1) / 2次比较,显然时间复杂度就是O(n ^ 2)(但是比起冒泡排序来说,简单选择的性能还是要比冒泡好一点。

直接插入排序

直接插入排序,就是将一个记录插入到已经排好序的有序表中,从而得到一个新的有序表。

先给出代码,稍后分析:

void InsertSort(SqList *L)
{
    int i, j;
    for (i = 2; i < L->length; i++)  //下标从2开始。
    {
        if ( L->r[i] < L->r[i - 1])
        {
            L->r[0] = L->r[i];
            for (j = i - 1; L->r[j] > L->r[0]; j--)
                L->r[j + 1] = L->r[j];
            L->r[j + 1] = L-> r[0];  //注意上面有j--,所以这里空出来的位置应该是j + 1
    }
}

代码分析:如上(升序排序),我们举个栗子,有一个无序数组{5, 3, 2, 4 , 6},现在要把它给拍好,怎么做呢?

首先,我们把r[1] = 5当作是有序的一个数组(这里的L->r[0]必须要空出来当哨兵),即:{ 5 };那么现在我们需要将剩下的{3, 2, 4, 6}插入到{5}这个有序表中,显然现在的问题就是插入到5左边还是右边了,为此,下标从2开始,循环比较两两之间的大小,如果后者比前者小,那么就把后者的值赋值给哨兵,再把前者适当的往后移动(这里的适当是有条件的,也就是L->r[j] > L->r[0],即到出现比哨兵小的数据为止)。移动完之后再把哨兵的值赋值给移动出来的空位。

复杂度分析:如果要排序的数组一开始就是有序的,那么只需要比较次数,时间复杂度为O(n),而最坏的情况(数组完全逆序),那么这个时候,当外循环等于2(总共执行n - 2次)时,内循环执行了n - 1次,当外循环等于3时,执行了n - 2次。。。。。。所以,总的执行次数为 n - 2 + n - 3 + ....+  1 = ( n-1) * (n - 2) / 2,也就是O(n^2)。虽然是平方阶,但是它的性能比冒泡和简单选择要好的多。

以上。

下次写希尔排序和堆排序

原文地址:https://www.cnblogs.com/zhlabcd/p/9104136.html

时间: 2024-10-09 15:13:29

简单选择排序和直接插入排序的相关文章

排序(二)__冒泡排序、简单选择排序和直接插入排序

前面<排序(一)__综述>提到按照算法的复杂度分为简单算法和改进算法两大类,本文主要就简单算法中的冒泡排序.简单选择排序和直接插入排序进行通俗详细的解析. 一.冒泡排序 1.基本概念 冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止.(动态图来自维基百科) 2.关键代码(优化之后) void BubbleSort(SqList *L) { int i,j; Status flag=TRUE;            //flag用作标记,避

排序算法学习之简单排序(冒泡排序,简单选择排序,直接插入排序)

一.冒泡排序 冒泡排序算是最基础的一种算法了,复杂度为O(N^2),其基本思想是:从最低端数据开始,两两相邻比较,如果反序则交换.代码如下: /*最基本的冒泡排序*/ void BubbleSort1 (int n, int *array) /*little > big*/ { int i, j; for (i=0; i<n-1; i++) { for (j=n-1; j>i; j--) { if (array[j] < array[j-1]) { int temp = array

冒泡排序、简单选择排序、直接插入排序

冒泡排序(Bubble Sort)的基本思想:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止.时间复杂度为O(n2). 简单选择排序(Simple Selection Sort)的基本思想:通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换.应该说,尽管与冒泡排序同为O(n2), 但简单选择排序的性能上还是要略优于冒泡排序. 直接插入排序(Straight Insertion Sort)的基本思想:将一个记录插入到前面已经排序好的有序表中

C语言-简单选择排序与直接插入排序的实现

/* Name: selectSort and insertSort Copyright: nyist Author: 润青 Date: 01/10/18 19:30 Description: 实现了简单选择排序与直接插入排序 */ #include<stdio.h> int a[100]; int n; void selectSort(); void insertSort(); int main(){ scanf("%d",&n); for(int i=0;i&l

排序 之 冒泡排序 简单选择排序 直接插入排序 希尔排序

排序的基本概念 假设含有n个记录的序列为{r1,r2,--,rn},其相应的关键字分别为{k1,k2,--,kn},需确定1,2,--,n的一种排序p1,p2,--,pn,使其相应的关键字满足kp1≤kp2≤--≤kpn非递减(或非递增)关系,即使得序列称为一个按关键字有序的序列{rp1,rp2,--,rpn},这样的操作就称为排序. 排序的稳定性 假设ki=kj(1≤i≤n,1≤j≤n,i≠j),且在排序前的序列中ri领先于rj(即i<j).如果排序后ri仍领先于rj,则称所用的排序方法是稳定

直接插入排序、二分插入排序、希尔排序、冒泡排序与简单选择排序

一.直接插入排序 稳定,时间复杂度:最好O(n).最差O(n^2).平均O(n^2),空间复杂度O(1) void InsertSort(int L[], int n) { int i, j,key; for (i = 1; i<n; i++) if(L[i] < L[i-1])//需要将L[i]插入到有序表L[0...i-1] { key = L[i]; for(j = i-1; j >= 0 && key < L[j]; j--)//后移 L[j+1] = L[

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

 写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.因此排序掌握各种排序算法非常重要.对下面介绍的各个排序,我们假定所有排序的关键字都是整数.对传入函数的参数默认是已经检查好了的.只是简单的描述各个算法并给出了具体实现代码,并未做其他深究探讨. 基础知识: 由于待排序的记录数量不同,使得排序过程中设计的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程.另一类是外部排序,

排序——直接选择排序(简单选择排序)

直接选择排序也称简单选择排序,是一种相对简单的排序算法,它的基本思想是:从一列数中找出最小的,和第一个交换:剩下的重新找出最小的,和这列数的第二个交换,......一直进行n-1次比较之后,该数列已经为有序数列了. 例如:已知一组无序数列:6 3 5 1 4 2 9 第一次:[6 3 5 1 4 2 9] 最小数为:1 第二次:1 [3 5 6 4 2 9] 最小数为:2 第三次:1 2 [5 6 4 3 9] 最小数为:3 第四次:1 2 3 [6 4 5 9] 最小数为:4 第五次:1 2

常见排序算法导读(3)[简单选择排序]

这一节将介绍简单选择排序(Simple Selection Sort). 在介绍简单排序算法之前,先给出排序的确切定义,并简单介绍一下排序算法的稳定性. 排序的确切定义 假设含有n个对象的序列为{R[0], R[1], ..., R[n-1]}, 其对应的关键字(key)序列为{K[0], K[1], ..., K[n-1]}. 所谓排序, 就是确定0, 1, ..., n-1的一种排列p[0], p[1], ..., p[n-1], 使各个关键字满足如下的非递减(升序)或非递增(降序)关系: