七种排序算法

 


方法

时间复杂度

空间复杂度

Stable

冒泡排序(Bubble Sort)

O(n) — O(n^2)

O(1)

yes

选择排序(Selection Sort)

O(n^2) — O(n^2)

O(1)

no

插入排序(Insertion Sort)

O(n) — O(n^2)

O(1)

yes

希尔排序(Shell Sort)

O(n) — O(n log^2 n)

O(1)

no

快速排序(Quick Sort)

O(n log n) — O(n log n) — O(n^2)

O(log n) — O(n)

no, but the stable exist

归并排序(Merge Sort)

O(n log n)

O(n)

yes

堆排序(Heap Sort)

O(n log n)

1

no

 

// 1. 冒泡排序

 1 public void bubbleSort(int[] A) {
 2      for(int i=A.length; i>0; i--) {
 3           boolean flag = true;
 4           for(int j=1; j<i; j++) {
 5                if(A[j]<A[j-1]) {
 6                     int tmp = A[j-1];
 7                     A[j-1] = A[j];
 8                     A[j] = tmp;
 9                     flag = false;
10                }
11           }
12           if(flag) {
13                break;
14           }
15      }
16 }

// 2. 选择排序

 1 public void selectionSort(int[] A) {
 2      for(int i=A.length; i>1; i--) {
 3           int maxIdx = 0;
 4           for(int j=1; j<i; j++) {
 5                if(A[j]>A[maxIdx]) {
 6                     maxIdx = j;
 7                }
 8           }
 9           if(maxIdx!=i-1) {
10                int tmp = A[maxIdx];
11                A[maxIdx] = A[i-1];
12                A[i-1] = tmp;
13           }
14      }
15 }

// 3. 插入排序

 1 public void insertionSort(int[] A) {
 2      for(int i=1; i<A.length; i++) {
 3           int tmp = A[i];
 4           int j = i-1;
 5           while(j>=0) {
 6                if(A[j]>=A[i])
 7                     j--;
 8                else break;
 9           }
10           int tmp = A[i];
11           j++;
12           for(int k=i; k>j; k--) {
13                A[k] = A[k-1];
14           }
15           A[j] = tmp;
16      }
17 }

// 4. 希尔排序  —  插入排序的一种更高效的改进版本

 1 public void shellSort(int[] A) {
 2      int step = A.length;
 3      while(step>1) {
 4           step = step>>1;
 5           for(int i=0; i<A.length; i++) {
 6                int pos = i+step;
 7                int tmp = A[pos];
 8                while((pos-step>=0) && tmp<A[pos-step]) {
 9                     A[pos] = A[pos-step];
10                     pos -= step;
11                }
12                A[pos] = tmp;
13           }
14      }
15 }

// 5. 快速排序

 1 public void quickSort(int[] A, int start, int end) {
 2      if (start >= end) return;
 3      int i = start;
 4      int j = end;
 5      int tmp = A[i];
 6      while(i<j) {
 7           while(i<j && A[j]>=tmp)
 8                j--;
 9           A[i] = A[j];
10           while(i<j && A[i]<tmp)
11                i++;
12           A[j] = A[i];
13       }
14       A[i] = tmp;
15       quickSort(A, start, i-1);
16       quickSort(A, i+1, end);
17 }

// 6. 归并排序

 1 public void mergeSort(int A[], int start, int end) {
 2       if(start<end) {
 3            int dis=(end-start)/2;
 4             mergeSort(A,start,start+dis);
 5             mergeSort(A,start+dis+1,end);
 6            merge(A,start,start+dis,start+dis+1,end);
 7       }
 8 }
 9 public void merge(int[] A,int start1,int end1,int start2,int end2) {
10      int[] temp=new int[end1-start1+end2-start2+2];
11      int k=0;
12      int i1=start1;
13      int i2=start2;
14      while(i1<=end1&&i2<=end2) {
15           if(A[i1]<A[i2])
16                temp[k++]=A[i1++];
17           else
18                temp[k++]=A[i2++];
19      }
20      while(i1<=end1)
21           temp[k++]=A[i1++];
22      while(i2<=end2)
23           temp[k++]=A[i2++];
24      for(int i=start1,mark=0;mark<k;i++)
25           A[i]=temp[mark++];
26 }

// 7. 堆排序  —  选择排序的一种更高效的改进版本

 1 /* 父节点i的左子节点在位置 (2*i+1);
 2  * 父节点i的右子节点在位置 (2*i+2);
 3  * 子节点i的父节点在位置 floor((i-1)/2);
 4  */
 5 public void heapSort(int[] A) {
 6      for(int i=A.length/2;i>=0;i--) {
 7           heapAdjust(A,i,A.length);
 8      } // O(n)
 9
10      for(int i=A.length-1;i>0;i--) {
11           swap(A[0],A[i]);
12           heapAdjust(A,0,i);
13      } // O(nlgn)
14 }
15
16 public void heapAdjust(int[] A,int i,int length) { // siftDown
17      while(2*i+1<length) {
18           int left=2*i+1;
19           if((left+1)<length && A[left]<A[left+1])
20                left++;
21           if(A[i]<A[left]) {
22                swap(A[i],A[left]);
23                i=left;
24           } else
25                break;
26      }
27 } 
时间: 2024-11-01 15:30:56

七种排序算法的相关文章

模板化的七种排序算法,适用于T* vector&lt;T&gt;以及list&lt;T&gt;

最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板纯属于偷懒,更方便于测试代码的有效性,等代码写完也懒得去改了.下面开始介绍这段代码,有什么不对的地方欢迎前来指正. 一共写了七种排序,插入排序InsertSort.堆排序HeapSort.快速排序QuickSort.合并排序MergeSort,计数排序CountingSort,基数排序RadixSo

[数据结构(二)]七种排序算法的C++简单实现

一.冒泡排序(Bubble Sort) 基本思想:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止. //冒泡排序 void BubbleSort(int *p, int length) { for (int i = 0; i < length-1; i++) { for (int j =length-1; j>=i;j--) { if (p[j-1] > p[j]) { swap(p[j-1], p[j]); } } } } 排序前的顺序为:9 1 5 8 3 7 4

七种排序算法(更新中。。。)

1 #include<iostream> 2 #include<cstdlib> 3 #include<ctime> 4 using namespace std; 5 const int len = 20; 6 //1.冒泡排序 7 void Bubble_sort(int s[],int len){ 8 bool flag; 9 for(int i=1;i<len-1;++i){ 10 flag=false; 11 for(int j=1;j<=len-i

七种排序算法的实现和总结

最近把七种排序算法集中在一起写了一遍. 注释里有比较详细的说明. 1 /*排序算法大集合**/ 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 6 //------------------快速排序------------------// 7 /* 8 核心: 9 如果你知道多少人该站你前面,多少人站你后面,你一定知道你该站哪个位置. 10 算法: 11 1.选取分界数,参考这个分界数,

总结N种排序算法及实现

排序算法是一个简单的问题,但在此问题上却有大量的研究!当前的排序算法通常按照如下四个方面进行分类(或是评价): 1.时间复杂度:一个排序算法的理想性能是O(n).一般而言,好的性能O(nlogn),坏的性能O(n2). 2.空间复杂度(内存使用量) 3.稳定性:稳定的排序算法会让原本有相等键值的记录维持原本的相对次序. 4.排序方式:插入.交换.选择.合并等 一.冒泡排序:这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. 步骤:1.比较相邻的两个元素,如果第一个比第二个大,就

八种排序算法(内部排序)

八种排序算法很长时间没有使用了,今天做一个总结,方便以后自己用的时候参考. 这八种排序算法都是内部算法,这八种排序算法分别是: 1. 插入排序 1)直接插入排序 2)希尔排序 2.选择排序 1)简单选择排序 2)堆排序 3.交换排序 1)冒泡排序 2)快速排序 4.归并排序 5.基数排序 一.直接插入排序 将一个记录插入到已经排好序的有序表中,从而得到一个新的.记录数增1的有序表.在实际操作中,先将序列的第一个记录看成是一个有序的子序列,然后从第二个.第三个.……记录逐个进行插入,直至整个序列有

12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用

出处:http://blog.csdn.net/han_xiaoyang/article/details/12163251. 声明:版权所有,转载请注明出处,谢谢. 0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比较笨的刷题学的,囧),不过又想了想,算法这东西,博主自己学的过程中一直深感,基础还是非常重要的,很多难题是基础类数据结构和题目的思想综

13种排序算法详解

0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比较笨的刷题学的,囧),不过又想了想,算法这东西,博主自己学的过程中一直深感,基础还是非常重要的,很多难题是基础类数据结构和题目的思想综合发散而来.比如说作为最基本的排序算法就种类很多,而事实上笔试面试过程中发现掌握的程度很一般,有很多题目,包括很多算法难题,其母题或者基本思想就是基于这些经典算法的,

Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等

本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排序.快速排序(重点).堆排序.归并排序等等.看下图: 给定数组:int data[] = {9,2,7,19,100,97,63,208,55,78} 一.直接插入排序(内部排序.O(n2).稳定) 原理:从待排序的数中选出一个来,插入到前面的合适位置. [java] view plain copy