选择、插入、冒泡排序

选择、插入、冒泡三种算是最典型的排序算法了,空间复杂度都为O(1)

选择排序时间复杂度跟初始数据顺序无关,O(n2),而且还不稳定;

插入排序时间复杂度跟初始数据顺序有关最好O(n),最坏O(n2),稳定

冒泡排序时间复杂度跟初始数据顺序有关最好O(n),最坏O(n2),稳定

三种算法中对于大量随机数,所需时间插入<选择<冒泡。

// MySort.h: interface for the MySort class.
#include "iostream.h"

template<class T>
void swap(T &a,T &b)
{
    T c=a;
    a=b;
    b=c;
}

template<class T>
void print(T a[], int n ,int i){
    cout<<"第"<<i+1 <<"趟 : ";
    for(int j= 0; j<10; j++){
        cout<<a[j] <<"  ";
    }
    cout<<endl;
}  

template<class T>
void selectSort(T a[],int n)  //选择排序
{
    int i,j,k;
    for(i=0;i<n-1;++i)
    {
        k=i;
        for(j=i+1;j<n;++j)
        {
            if(a[j]<a[k])
                k=j;
        }
        if(k!=i)
            swap(a[i],a[k]);
    }
}

template<class T>
void selectSort2(T a[],int n)  //二元选择排序
{
    int i,j,min,max;

    for (i=1;i <= n/2;++i)    // 做不超过n/2趟选择排序
    {
        min = i; max = i ; //分别记录最大和最小关键字记录位置
        for (j= i; j<=n-i; ++j)
        {
            if (a[j] > a[max]) {
                max = j ;
                continue ;
            }
            if (a[j]< a[min])
                min = j ;   

        }
        //该交换操作还可分情况讨论以提高效率
        swap(a[i-1],a[min]);
        if(max!=i)
            swap(a[n-i],a[max]);

#ifdef _DEBUG
        print(a,n,i-1);
#endif

    }
}

template<class T>
void insertSort(T a[],int n)  //插入排序
{
    int i;
    for(i=1;i<n;++i)
    {
        if(a[i]<a[i-1])
        {
            int j= i-1;
            T x = a[i];         //复制为哨兵,即存储待排序元素
            a[i] = a[i-1];      //先后移一个元素
            while(j>=0 && x<a[j])     //查找在有序表的插入位置
            {
                a[j+1] = a[j];  //元素后移
                j--;
            }
            a[j+1] = x;        //插入到正确位置
        }
    }

}
template<class T>
void bubbleSort(T a[],int n)  //冒泡排序
{
/*
int i,j;
for(i=0; i<n-1; ++i) {
for(j=0; j<n-i-1; ++j) {
if(a[j] > a[j+1])
{
swap(a[j],a[j+1]);
}
}
#ifdef _DEBUG
print(a,n,i);
#endif
}
    */

    bool bSwaped = true;

    int i,j;
    int lastSwapPos, lastSwapPos_temp = 0;
    for(i=0; i<n-1; ++i)
    {
        bSwaped = false;
        lastSwapPos = lastSwapPos_temp; 

        for(j=n-1; j>lastSwapPos; j--)
        {
            if(a[j-1] > a[j])
            {
                swap(a[j],a[j-1]); 

                bSwaped = true;  

                lastSwapPos_temp = j - 1;
            }
        }
        // 如果上一次扫描没有发生交换,则说明数组已经全部有序,退出循环
        if(!bSwaped)
            break;
    } 

}
时间: 2024-11-05 20:29:14

选择、插入、冒泡排序的相关文章

python 数据结构与算法之排序(冒泡,选择,插入)

目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 计算机重要的几门课: 1.数据结构和算法 2.网络 3.操作系统 4.计算组成原理 数据结构与算法: 算法: 衡量算法的标准: 时间复杂度:就是程序代码执行的大概次数 小结: 时间复杂度是用来估计算法运行时间的一个式子(单位) 一般来说,时间复杂度高的算法比复杂度低的算法慢 常见的

01. Java的经典排序--选择排序--冒泡排序--折半查找(二分查找)

Java的经典排序--选择排序--冒泡排序--折半查找 选择排序 选择排序 3 2 1 5 8 0 1 3 2 5 8 1 1 2 3 5 8 2 1 2 3 5 8 3 1 2 3 5 8 public static void main(String[] args) { int[] arr={3,2,1,5,8}; selectSort(arr); for(int i = 0 ; i < arr.length ; i ++){ System.out.println(arr[i]) ; } }

选择、冒泡排序,二分查找法以及一些for循环的灵活运用

import java.util.Arrays;//冒泡排序 public class Test { public static void main(String[] args) { int[] array = { 31, 22, 15, 77, 52, 32, 18, 25, 16, 7 }; // 冒泡 --> 两两比较 --> 提取出最大的数 在最后一位 //拿第一位和它后面的一位进行 两两比较 System.out.println(Arrays.toString(array)); fo

数据结构与算法 4:排序算法,选择/插入/冒泡/希尔/快速/归并

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 排序算法 平均复杂度 冒泡排序    O(n2) 选择排序     O(n2) 插入排序     O(n2) 希尔排序     O(n1.5) 快速排序    O(N*logN) 归并排序     O(N*logN) 堆排序     O(N*logN) 基数排序     O(d(n+r)) 选择排序: [email protected]://990487026.blog.51cto.com~/sort$ c

java中各种经典排序(冒泡 选择 插入 希尔等)

1 import java.util.Arrays; 2 3 public class ArraySort { 4 public static void main(String[] args) { 5 int[] arr = { 12, 23, 14, 5, 64, 35, 42 }; 6 System.out.println("排序前:"); 7 System.out.println(Arrays.toString(arr)); 8 // bubbleSort(arr); 9 //

冒泡 选择 插入 希尔 堆 归并 快速 排序算法

排序相关概念 排序:对一序列对象根据某个关键字进行排序: 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面: 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面: 内排序:所有排序操作都在内存中完成: 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行: 排序耗时的操作:比较.移动: 排序分类: (1)交换类:冒泡排序.快速排序:此类的特点是通过不断的比较和交换进行排序: (2)插入类:简单插入排序.希尔排序:此类的特点是通过插入的

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

1.选择排序 每一次找出最小的值,放在最前面的位置,一个一个安置 //选择排序 #include<iostream> #include<climits> using namespace std; template<class T> void gcd(T a[],int n){ int mix,temp; for(int i=0;i<n-1;i++){ mix=i; for(int j=i+1;j<n;j++) if(a[j]<a[mix]) mix=j

简单分析选择排序,冒泡排序

1,选择排序的原理  1.1 选择排序就是会依次利用每一位索引上的值,与它后面的所有值进行比较,而且在每经过一轮比较,最值就会出现在最前面 2,冒泡排序的原理  2.1 冒泡排序的原理就是两个相邻的元素进行比较,每比较一轮,最值就会出现在最后面 #include <stdio.h>void getLow(int count[],int length);void countNumber(int count1[],int length);void getLarge(int count[],int

Java——选择、冒泡排序、折半查找

1 //选择排序对数据进行升序排序 2 public static void selectSortArray(int[] arr){ 3 for(int i = 0; i<arr.length-1;i++){ 4 for(int j = i+1;j<arr.length;j++){ 5 if(arr[i]>arr[j]){ 6 int temp = arr[j]; 7 arr[j] = arr[i]; 8 arr[i] = temp; 9 } 10 } 11 } 12 } 13 //冒泡

选择和冒泡排序

1 #include <stdio.h> 2 3 int main() 4 { 5 int arr[5] = {4, 7, 9, 2, 6}; 6 int brr[5] = {7, 8, 4, 2, 1}; 7 /*冒泡排序*/ 8 int i, j, tmp=0, swap=0; 9 10 for(i=0; i<5; i++) 11 for(j=0; j<4-i; j++){ 12 if(arr[j] < arr[j+1]){ 13 tmp = arr[j]; 14 arr