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

冒泡排序(Bubble Sort)的基本思想:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。时间复杂度为O(n2).

简单选择排序(Simple Selection Sort)的基本思想:通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换。应该说,尽管与冒泡排序同为O(n2), 但简单选择排序的性能上还是要略优于冒泡排序。

直接插入排序(Straight Insertion Sort)的基本思想:将一个记录插入到前面已经排序好的有序表中,从而得到一个新的、记录数不断加1的有序表。直接插入排序法的时间复杂度为O(n2) 。从这里也看出,同样的

O(n2)时间复杂度,直接插入排序法比冒炮和简单选择排序的性能要好一些。

  1 //冒泡排序、简单选择排序、直接插入排序
  2 #include "stdafx.h"
  3
  4 #include "stdio.h"
  5 #define TRUE 1
  6 #define FALSE 0
  7
  8 void bubblesort(int *list, int index);
  9 void selectsort(int *list, int index);
 10 void insertsort(int *list, int index);
 11
 12 typedef int status;
 13 int list[20];    //默认最大长度为20
 14 int temp;
 15 int i, j;
 16 int node;
 17 status change = TRUE;
 18
 19 void swap(int *list, int i, int j)//交换元素
 20 {
 21     temp = list[i];
 22     list[i] = list[j];
 23     list[j] = temp;
 24 }
 25
 26 void main(void)
 27 {
 28     int index = 0;
 29     printf("Please input the value you want to sort(exit for 0):\n");
 30     scanf_s("%d", &node);
 31     while (node != 0)
 32     {
 33         list[index] = node;
 34         index += 1;
 35         scanf_s("%d", &node);
 36     }
 37     bubblesort(list, index);
 38     selectsort(list, index);
 39     insertsort(list, index);
 40 }
 41
 42 void bubblesort(int *list, int index) //冒泡排序 时间复杂度O(n2)
 43 {
 44     for (j = 0; j<index && change; j++)
 45     {
 46         change = FALSE;
 47         for (i = 1; i<index - j; i++)
 48         {
 49             if (list[i - 1]>list[i])
 50             {
 51                 swap(list, i - 1, i);
 52                 change = TRUE;
 53             }
 54         }
 55     }
 56     printf("\n冒泡排序后为:");
 57     for (i = 0; i < index; i++)
 58     {
 59         printf("%d ", list[i]);
 60     }
 61
 62 }
 63
 64 void selectsort(int *list, int index)//简单选择排序  时间复杂度O(n2)
 65 {
 66     int min;
 67     for (i = 0; i < index - 1; i++)
 68     {
 69         min = i;
 70         for (j = i + 1; j < index; j++)
 71         {
 72             if (list[i]>list[j])
 73             {
 74                 min = j;
 75             }
 76             if (min != i)
 77             {
 78                 swap(list, min, i);
 79             }
 80         }
 81     }
 82     printf("\n简单选择排序后为:");
 83     for (i = 0; i < index; i++)
 84     {
 85         printf("%d ", list[i]);
 86     }
 87 }
 88
 89 void insertsort(int *list, int index)//直接插入排序  时间复杂度O(n2)
 90 {
 91     for (i = 1; i < index; i++)
 92     {
 93         if (list[i - 1]>list[i])
 94         {
 95             temp = list[i];
 96             for (j = i; j >= 1 && list[j-1] > temp ;j--)
 97             {
 98                 list[j] = list[j - 1];
 99             }
100             list[j] = temp;
101         }
102     }
103     printf("\n直接插入排序后为:");
104     for (i = 0; i < index; i++)
105     {
106         printf("%d ", list[i]);
107     }
108 }
时间: 2024-07-28 16:48:37

冒泡排序、简单选择排序、直接插入排序的相关文章

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

排序的基本概念 假设含有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,则称所用的排序方法是稳定

各种常见的排序,冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序

各种常见的排序 要开始找工作了,把以前学的各种小知识复习一遍,以下是各种常见的排序的简单实现(冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序),至于原理就不写出来了,代码比较简单,看一下就懂,再不行可以随意找本书或百度! #include <iostream> using namespace std; // 冒泡 void BubbleSort(int data[], int length) { if(data == NULL || length <= 0)

冒泡排序,选择排序,插入排序

从今天开始希望自己的博客可以持续的更新起来,由于本人能力有限,所以有些内容可能会有疏漏或者不全面,希望大家可以指出来,让我们一起学习,一起进步. 今天的内容是最简单的三个排序算法,冒泡排序,选择排序,插入排序,它们的时间复杂度都是O(N^2). 冒泡排序:首先第一个数与第二个数比较,如果前面的大于后面的就交换两个数,然后第二个与第三个比较,直到比较到最后,此时最后一个数为数组最大值,然后循环次步骤,第二次比较到倒数第二位,这样经过两次循环最后两位就排好了,经过N次循环,数组就拍好了 选择排序:从

Java排序算法分析与实现:快排、冒泡排序、选择排序、插入排序、归并排序(二)

一.概述: 上篇博客介绍了常见简单算法:冒泡排序.选择排序和插入排序.本文介绍高级排序算法:快速排序和归并排序.在开始介绍算法之前,首先介绍高级算法所需要的基础知识:划分.递归,并顺带介绍二分查找算法. 二.划分: 划分是快速排序的前提,即把数据分为两组,大于特定值的数据在一组,小于特定值的数据在另一组.快速排序即是由划分和递归操作来完成的. (1)原理: 定义一个阈值,分别从最左面和最右面向中间遍历元素,左面找到一个大于阈值的数据便停止,右边找到一个小于阈值的数据便停止,如果此时左右两边都还没

JavaScript算法(冒泡排序、选择排序与插入排序)

冒泡排序.选择排序与插入排序复杂度都是指数级别的,放在一起说吧. 介绍一些学习这三个排序方法的比较好的资料.冒泡排序看<学习JavaScript数据结构与算法>介绍的冒泡排序,选择排序看<计算机科学概论(第三版)>里介绍的选择排序,插入排序看<计算机科学概论(第11版)>里介绍的插入排序, 通过这三份资料弄明白实现原理之后,最后看<学习JavaScript数据结构与算法>一书里的JS实现代码. 嗯,这本书里都有现成代码,就不在这儿写了,关键是弄清楚原理,然后

java面向对象的冒泡排序,选择排序和插入排序的比较

这三种排序有俩个过程: 1.比较俩个数据. 2.交换俩个数据或复制其中一项. 这三种排序的时间级别 冒泡排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换  0——N2/2 = N2/4 总时间 3/4*N2 选择排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换  0——3*(N-1)=3*(N-1)/2=3/2*N 总时间 N2/2+3/2*N 插入排序:第一轮最多比较一次,第二轮最多比较俩次,最后一轮比较N-1

冒泡排序、选择排序、插入排序、快速排序

冒泡排序(Bubble Sort) 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的数列,一次笔记两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行知道没有在需要的交换,也就是说该数列已经排序完成. 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名. data_set = [ 9,1,22,31,45,3,6,2,11 ] loop_count = 0 for j in range(len(data

Python排序-冒泡排序、选择排序、插入排序

''' 冒泡排序 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 这个算法的名字由来是因为越大的元素会经由交换慢慢"浮"到数列的顶端 ''' data_set = [12,45,2,48,66,2,1,56,36,90,5,10,503] for i in range(len(data_set)): ##控制相邻比较的轮数 for j in range(len(data_set

python开发之路Day17-算法设计(冒泡排序、选择排序、插入排序、二叉树)

s12-20160514-day17 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin

Java学习 (七)、数组,查找算法,二分查找法,冒泡排序,选择排序,插入排序

一.常用数组查找算法 工作原理:它又称为顺序查找,在一列给定的值中进行搜索,从一端的开始逐一检查每个元素,知道找到所需元素的过程. 例1:查找指定的数在数组中出现的位置,找到返回下标,找不到返回-1 1 import java.util.Scanner; 2 public class LinearSearch{ 3 public static void main(String []argas) 4 { 5 int [] array={10,100,90,65,80,92}; 6 System.o