Collection of algorithm for sorting. 常见排序算法集(一)

Collection of algorithm for sorting (part one)

选择排序--Selection sort

可能你会觉得奇怪,为什么用结构体传参? 那是一层封装,我在面向对象的思想来写 : )

对已一个数组,不管怎么操作,都不能越界. C语言 不会自动检查数组越界。这个时候程序员就应该负起责任来。

数组的边界成为数组必不可少的信息,此时可以把array当作一个对象来看,即此时的element.

我们排序的对象可能会变,比方说从int类型变到char类型,这时候我们仅仅去改变struct element就可以了

不必要去改动API.  面向对象是一种思想。即使C语言不具备,但是程序员也应该有这种思想.把程序变得更棒.

/***************************************************
code writer	:	EOF
code date	:	2014.09.14
code file	:	selection_sort.c
e-mail		:	[email protected]

******************************************************/
#include <stdio.h>

#define DEBUG
#define ARRAY_SIZE 6

struct element
{
	int array[ARRAY_SIZE];
	int size;
};

int selection_sort(struct element* element)
{
	if(!element)
	{
		printf("element is NULL!\n");
		return 0;
	}

	int tmp_1       = 0;
	int tmp_2       = 0;
	int swap	= 0;
	int min_index   = 0;

	for(tmp_1 = 0;tmp_1 < element->size;tmp_1++)
	{
		min_index = tmp_1;

		for(tmp_2 = tmp_1;tmp_2 < element->size;tmp_2++)
		{
			if(element->array[min_index] > element->array[tmp_2])
			{
				min_index = tmp_2;
			}
		}	

		swap =  element->array[min_index];
		element->array[min_index] = element->array[tmp_1];
		element->array[tmp_1] = swap;

	}
	return 0;
}
#ifdef DEBUG

void print_element(struct element* const element)
{
	if(!element)
	{
		printf("");
		return ;
	}

	int tmp = 0;

	for(tmp = 0;tmp < element->size; tmp++)
	{
		printf("%d ",element->array[tmp]);
	}

	printf("\n");
}

int main()
{
	/*
	** Initialize this element.
	*/
	struct element test_element = {
					{1,4,9,6,3,2},
					ARRAY_SIZE,
				       };

	printf("Before sorting\n");
	print_element(&test_element);

	selection_sort(&test_element);

	printf("Before sorting\n");
	print_element(&test_element);

	return 0;
}
#endif

插入排序 insertion sort

这里和上面的不同仅仅是排序算法的不同.

/***************************************************
code writer	:	EOF
code date	:	2014.09.14
code file	:	insertion_sort.c
e-mail		:	[email protected]

******************************************************/
#include <stdio.h>

#define DEBUG
#define ARRAY_SIZE 6

struct element
{
	int array[ARRAY_SIZE];
	int size;
};

int insertion_sort(struct element* element)
{
	if(!element)
	{
		printf("element is NULL!\n");
		return 0;
	}

	int tmp_1       = 0;
	int tmp_2       = 0;
	int swap	= 0;

	for(tmp_1 = 0;tmp_1 < element->size; tmp_1++)
	{
		for(tmp_2 = tmp_1;tmp_2-1 > 0 && tmp_2 > 0; tmp_2--)
		{
			if(element->array[tmp_2] < element->array[tmp_2-1])
			{

				swap		      = element->array[tmp_2];
				element->array[tmp_2] = element->array[tmp_2-1];
				element->array[tmp_2-1] = swap;
			}
			else
			{
				break;
			}
		}	

	}

	return 0;
}
#ifdef DEBUG

void print_element(struct element* const element)
{

	if(!element)
	{
		printf("Function:%s line:%d Somebody passed NULL into print_element\n",__FUNCTION__,__LINE__);
		return ;
	}

	int tmp = 0;

	for(tmp = 0;tmp < element->size; tmp++)
	{
		printf("%d ",element->array[tmp]);
	}

	printf("\n");
}

int main()
{
	/*
	** Initialize this element.
	*/
	struct element test_element = {
					{1,4,9,6,3,2},
					ARRAY_SIZE,
				       };

	printf("Before sorting\n");
	print_element(&test_element);

	insertion_sort(&test_element);

	printf("Before sorting\n");
	print_element(&test_element);

	return 0;
}
#endif

希尔排序  shell sort

如果搞定了上面的插入排序,希尔排序不是问题的...

自己写出来就会发现,希尔排序其实就是插入排序的一种改进.它把原来插入排序的一整个数组划分成多个小数组排序.

/***************************************************
code writer	:	EOF
code date	:	2014.09.14
code file	:	shell_sort.c
e-mail		:	[email protected]

******************************************************/
#include <stdio.h>

#define DEBUG
#define ARRAY_SIZE 6

struct element
{
	int array[ARRAY_SIZE];
	int size;
};

int shell_sort(struct element* element)
{
	if(!element)
	{
		printf("element is NULL!\n");
		return 0;
	}

	int increment   = 0;
	int tmp_1       = 0;
	int tmp_2       = 0;
	int swap	= 0;

	for(increment = element->size/2; increment > 0;increment /=2 )
	{
		for(tmp_1 = increment;tmp_1 < element->size;tmp_1++)
		{
			for(tmp_2 = tmp_1;tmp_2 >= increment;tmp_2 -= increment)
			{
				if(element->array[tmp_2] < element->array[tmp_2-increment])
				{
					swap		      		= element->array[tmp_2-increment];
					element->array[tmp_2-increment] = element->array[tmp_2];
					element->array[tmp_2] 		= swap;
				}
			}	

		}

	}
	return 0;
}
#ifdef DEBUG

void print_element(struct element* const element)
{
	if(!element)
	{
		printf("Panic! NULL was passed into %s %d :(",__FUNCTION__,__LINE__);
		return ;
	}

	int tmp = 0;

	for(tmp = 0;tmp < element->size; tmp++)
	{
		printf("%d ",element->array[tmp]);
	}

	printf("\n");
}

int main()
{
	/*
	** Initialize this element.
	*/
	struct element test_element = {
					{1,4,9,6,3,2},
					ARRAY_SIZE,
				       };

	printf("Before sorting\n");
	print_element(&test_element);

	shell_sort(&test_element);

	printf("Before sorting\n");
	print_element(&test_element);

	return 0;
}
#endif

西斯廷圣母 拉斐尔

时间: 2024-07-28 16:23:58

Collection of algorithm for sorting. 常见排序算法集(一)的相关文章

Collection of algorithm for sorting. 常见排序算法集(二)

Collection of algorithm for sorting heap sort 堆排序 The heapsort algorithm can be divided into two parts. In the first step, a heap is built out of the data. The heap is often placed in an array with the layout of a complete binary tree. The complete b

Collection of algorithm for sorting. 常见排序算法集(三) —— Quick Sort

Quick Sort 快排,一个排序方法能直接享受这样的名称殊荣,呵呵,可见其威力与重要性. 其中最重要的思想就是 "分治"-- divide and conquer ! 这里排序用到的思想极其简单,却是很实用的!小孩子都会的简单想法. 先把所有数据分成三个部分. 在所有数据中选取某一元素X,比X小的放左边,比X大的放右边. 接着把这一思想同样分别施加在X元素的左边和右边部分,同样继续划分,选出一个元素X' 比X'小的放左边比X'大的放右边. 继续施加这种划分策略,直到划分的元素很少(

几种常见排序算法

几种常见排序算法 几种常见排序算法 写在前面 基础介绍 初级排序算法 selection sort选择排序 insertion sort插入排序 ShellSort希尔排序 shuffing不是排序算法 merge sort归并排序 Abstract in-place merge原地归并的抽象方法 Top-down mergesort自顶向下的归并排序 Bottom-up mergesort自底向上的归并排序 quicksort 三向切分的快速排序 Heapsort堆排序 总结和比较 命题 本文

【整理】常见排序算法及其时间复杂度总结

原文出处: 1. 白话经典算法系列之八 MoreWindows白话经典算法之七大排序总结篇 2. 面试常用算法总结--排序算法(java版) 3. 常见排序算法小结 本篇主要整理了冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序,堆排序七种常见算法,是从上面三篇博文中摘抄整理的,非原创. 一.冒泡排序 主要思路是: 通过交换相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就"沉"到最后面了.重复N次即可以使数组有序. 冒泡排序改进1: 在某次遍历中,如果没有

常见排序算法(一) MergeSort

算法思想灰常重要,常见的用到分治思想的算法包括快速排序,归并,二分搜搜,大整数乘法等(参考 http://blog.csdn.net/com_stu_zhang/article/details/7233761,归纳很到位) 简单用归并对一个数组排序 思路: 简单来说对一个数组,只要他的左右两部分都是有序的,那么简单合并就ok了,那么左右两部分可以进一步划分各自的左右两部分----明显就是要递归了 算法:归并排序 1. 将数组一分为二,subArray1 和subArray2 2. 归并排序sub

常见排序算法(java实现)

常见排序算法介绍 冒泡排序 代码: public class BubbleSort { public static void sort(int[] array) { int tValue; for (int i = 0; i < array.length; i++) { for (int j = i; j < array.length; j++) { if (array[i] > array[j]) { tValue = array[i]; array[i] = array[j]; ar

常见排序算法(冒泡、选择、插入、快速、归并C++实现)

常见排序算法(冒泡.选择.插入.快速.归并C++实现) #include <iostream> using namespace std; // 冒泡排序 void bubbleSort (int data[], size_t size) { for (size_t i = 0; i < size - 1; ++i) { bool ordered = true; for (size_t j = 0; j < size - 1 - i; ++j) if (data[j+1] <

第六章 常见排序算法

上章回顾 二叉树的定义 树深度的定义 什么样的二叉树是满二叉树 中序遍历的规则 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git 第六章 第六章 常见排序算法 常见排序算法 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorith

常见排序算法总结(java实现)

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.常见的排序算法有选择排序,插入排序,希尔排序,归并排序和快速排序 由于在排序的过程中不可避免的要涉及到比较和交换,所以将他们抽取为两个单独的函数,如下所示 //为了排序代码的通用性,这里假定待排序的元素实现了Comparable接口 private static boolean less(Comparable v ,Comparable w){ return v.compareTo(w)<0; } priva