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

一、直接插入排序

稳定,时间复杂度:最好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[j];
			L[j+1] = key;//插入到正确位置
		}
}

二、二分插入排序

查找插入位置时使用二分查找,稳定,最佳情况O(n lg n),最差和平均情况O(n^2),空间复杂度O(1)。

void BInsertSort(int L[], int n)
{
	int i, j,key, low, mid, high;
	for (i = 1; i < n; i++)
	{
		key = L[i];
		low = 0; high = i-1;
		while(low <= high)//在有序的L[low,...,high]中折半查找有序插入的位置
		{
			mid = (low+high)/2;
			if(key < L[mid])
				high = mid - 1;
			else
				low = mid + 1;
		}
		for (j = i-1; j>=high+1;j--)//后移	//j >= low
			L[j+1] = L[j];
		L[high+1] = key;//插入key		   //L[low] = key
	}
}

三、希尔排序

不稳定,时间复杂度在理想情况下是O(nlgn),最坏情况为O(n^2)。空间复杂度O(1)

void ShellSort(int L[], int n)
{
	int gap = n,i, j, tmp;
	int k1=0, k2;
	while (gap > 1)//一趟shell排序
	{
		k1++;k2=0;
		gap = gap/3+1;
		for(i = gap; i < n; i++)
			if(L[i] < L[i-gap])
			{
				k2++;
				tmp = L[i];
				for(j = i-gap;j>=0 && tmp < L[j]; j -= gap)
					L[j+gap] = L[j];
				L[j+gap] = tmp;
				//printf("gap=%d,%d_%d: ",gap,k1, k2);Print(L, n);
			}
	}
}

四、冒泡排序

稳定,时间复杂度最好O(n),最坏和平均情况为O(n^2)。空间复杂度O(1)。

void BubbleSort(int L[], int n)
{
	bool exchange;
	int i, j;
	for(i = 0; i < n; i++)
	{
		exchange = false;
		for(j = n-1; j >i; j--)
			if(L[j] < L[j-1])//这里是小的数往上一直交换
			{
				std::swap(L[j], L[j-1]);
				exchange = true;
			}
		if(!exchange)
			break;
	}
}

五、简单选择排序

不稳定,时间复杂度O(n^2)。空间复杂度O(1)。

void SlectSort(int L[], int n)
{
	int i, j, index;
	for(i = 0; i < n-1; i++)
	{
		index = i;
		for(j = i+1; j < n; j++)
			if(L[j] < L[index])
				index = j;
		if(index != i)
			std::swap(L[i], L[index]);
	}
}

参考:http://blog.csdn.net/han_xiaoyang/article/details/12163251#t128

白话经典算法系列之三 希尔排序的实现

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

时间: 2024-10-13 23:28:15

直接插入排序、二分插入排序、希尔排序、冒泡排序与简单选择排序的相关文章

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

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

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

前面<排序(一)__综述>提到按照算法的复杂度分为简单算法和改进算法两大类,本文主要就简单算法中的冒泡排序.简单选择排序和直接插入排序进行通俗详细的解析. 一.冒泡排序 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)的基本思想:将一个记录插入到前面已经排序好的有序表中

冒泡排序与简单选择排序——Java实现

1.冒泡排序 1)原理说明:重复遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 2)代码实现: package com.test.sort; public class BubbleSort { public static void sort(int[] data) { for (int i = 0; i < data.length; i++) { for (int j = data.length

14. 蛤蟆的数据结构进阶十四排序实现之简单选择排序

14. 蛤蟆的数据结构进阶十四排序实现之简单选择排序 本篇名言:"即是我们是一支蜡烛也应该 " 蜡烛成灰泪始干 " 即使我们只是一根火柴也要在关键时刻有一次闪耀即使我们死后尸骨都腐烂了解也要变成磷火在荒野中燃烧. -- 艾青" 继续来看什么是简单选择排序. 欢迎转载,转载请标明出处: 1.  简单选择排序 设所排序序列的记录个数为n.i取1,2,-,n-1,从所有n-i+1个记录(Ri,Ri+1,-,Rn)中找出排序码最小的记录,与第i个记录交换.执行n-1趟后就完

排序算法之简单选择排序

基本思想 在一组元素中选择具有最小排序码的元素,若它不是这组元素中的第一个元素,则将它与这组元素中的第一个元素对调:在未排序的剩下的元素中反复运行以上步骤,直到剩余元素仅仅有一个为止. 代码 private void selectSort(int[] a, int left, int right) { for (int i = left; i < right; i++) { int k = i; int temp; for (int j = i + 1; j <= right; j++) {

排序系列 之 简单选择排序及其改进算法 —— Java实现

简单选择排序算法: 基本思想: 在待排序数据中,选出最小的一个数与第一个位置的数交换:然后在剩下的数中选出最小的数与第二个数交换:依次类推,直至循环到只剩下两个数进行比较为止. 实例: 0.初始状态 3,1,5,7,2,4,9,6(共8个数) 1.n=8 个数中,最小数值为1,与第一个数交换:1,3,5,7,2,4,9,6 2.剩下 n-1=7 个数中,最小数值为2,与第二个数交换:1,2,5,7,3,4,9,6 3.剩下 n-2=6 个数中,最小数值为3,与第三个数交换:1,2,3,7,5,4

选择排序=》(简单选择排序)

/** * 选择排序(简单选择排序) * @author Cinn * */public class selectSort { /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        int[] array= {48,58,50,98,69,51,27,99,100};        selectsort(ar