数据结构之常见的排序算法c语言实现

常见的简单排序算法有冒泡排序、选择排序、插入排序、快排、堆排序、归并排序、希尔排序等,这些排序的理论在网上有很多,这就只给出常见的排序算法源码,上学时候写的,不足之处欢迎大家指正。

下面几种排序的主函数入口为:

    int main(int argc, char* argv[])    
    {
    	int i, len;
    	int a[] = {8,5,6,4,9,10,3,15,2,17};
    
    	len = (sizeof(a) / sizeof(a[0]));
    
    	printf("before sort \n");
    	for (i = 0 ; i < len; i++) {
    	    printf("%d,", a[i]);
    	}
    	printf("\n");
    
    	bubb_sort(a, len);
    	select_sort(a, len);
    	inert_sort(a, len);
    
    	printf("after sort \n");
    	for (i = 0 ; i < len; i++) {
    	    printf("%d,", a[i]);
    	}
    	printf("\n");
    
    	return 0;
    }

1、冒泡排序

    static void swap(int *x, int *y)    
    {
    	int tmp;
    
    	tmp = *x;
    	*x = *y;
    	*y = tmp;
    } 

    void bubb_sort(int array[], int arr_len)
    {
    	int i, j;
    	int flag; 
    
    	for (i = 0; i < arr_len; i++) {
    	    flag = 0; /* identify the existing array is sorted or not */
    	    for (j = 0 ; j < arr_len - i - 1; j++) {
    	        if (array[j] > array[j + 1]) {
    	            swap(&array[j], &array[j + 1]);
    		    flag = 1;
    		}
    	    }
    	    if (flag == 0) {
    	        break;
    	    } 
    	}
    }

上面的代码为了加快比较速度,引入了变量flag,当无数据交换发生时,表示数据已经是有序的了,则可以直接结束排序。

2、选择排序

    void select_sort(int array[], int arr_len)
    {
        int tmp;
        int i, j;
    
        for (i = 0; i < arr_len; i++) {
            tmp = i;
            for (j = i + 1; j < arr_len; j++) {
                if (array[j] < array[tmp]) {
                    tmp = j;
                }
            }
            if (tmp != i) {
                swap(&array[tmp], &array[i]);   
            } 
        }
    }

3、插入排序

    void inert_sort(int array[], int arr_len)    
    {
        int i, j;
        int tmp;
    
        for (i = 1; i < arr_len; i++) {
            tmp = array[i];
            j = i - 1;
    
            while ((j >= 0) && (array[j] > tmp)) {
                array[j + 1] = array[j];
                --j;
            }
            array[j + 1] = tmp;
        }
    }
    以上三种排序算法,时间复杂度都为O(n2).

4、堆排序

    #define LEFT_CHILD(i) (2*(i) + 1)    
    
    void percdown(int a[],int i,int n)
    {
        int temp,child;
    
        for (temp = a[i]; LEFT_CHILD(i) < n ; i = child) {
            child = LEFT_CHILD(i);
            if (child != n-1 && a[child] < a[child + 1]) {
                child ++;
            }
            
            if (temp < a[child]) {
                a[i] = a[child];
            } else {
                break;
            }
        }
        a[i] = temp;
    }
    
    void heap_sort(int a[], int n)
    {
        int i;
        /* 建立堆 */
        for (i = n/2; i >= 0; i--) {
            percdown(a,i,n);
        }
        /* 删除最大值到堆的最后单元 */
        for (i = n-1; i>0; i--) {
            swap(&a[i],&a[0]);
            percdown(a,0,i);
        }
    }

5、希尔排序

    void shell_queue(int array[], int arr_len)    
    {
        int gap, m, n, k;
    
        gap = (arr_len / 2);
    
        while (gap > 0) {
            for (k = 0; k < gap; k++) {
                for (n = k + gap; n < arr_len; n += gap) {
                    for (m = n - gap; m >= k; m -= gap) {
                        if (array[m] > array[m+gap]) {
                        	swap(&array[m], &array[m+gap]);
                        } else {
                            break;
                        }
                    }
                }
            }
            gap /= 2;
        }
    }
    希尔排序和插入排序有点类似,上面的代码嵌套层数有点多,不太容易弄明白,带入几个数值试试就好了。

6、快速排序

    int mid_data(int array_a[], int left, int right)    
    {
        int mid;
    
        mid = (left + right) / 2;
    
        if (array_a[left] > array_a[right]) {
            swap(&array_a[left], &array_a[right]);
        }
        
        if (array_a[left] > array_a[mid]) {
            swap(&array_a[left], &array_a[mid]);
        }
        
        if (array_a[mid] > array_a[right]) {
            swap(&array_a[mid], &array_a[right]);
        }
    
        swap(&array_a[mid], &array_a[right-1]);
    
        return array_a[right-1];
    }
    
    
    void insertion_sort(int array[], int len)  
    {  
        int tmp, i, j;
    
        for (i = 1; i < len; i++) {
            tmp = array[i];  
            for (j = i; (j  > 0) && (tmp < array[j-1]); j--) {
            	array[j] = array[j-1];
            }
            array[j] = tmp;  
        }  
    }  
    
    void q_sort(int array_a[],int left,int right)
    {
        int i,j;
        int mid;
    
        if ((left + 3) <= right) {
            mid = mid_data(array_a, left, right);
            i = left; 
            j = right-1;
    
            while (1) {
                while(array_a[++i] < mid);
                while(array_a[--j] > mid);
                
                if (i <= j) {
                    swap(&array_a[i], &array_a[j]);
                }
                else {
                    break;
                }
            }
            swap(&array_a[i], &array_a[right-1]);
            
            q_sort(array_a, left, i - 1);
            q_sort(array_a, i + 1, right);
        } else {
            insertion_sort(array_a + left, right - left + 1);
        }
    }
    
    void quick_sort(int array[],int arr_len)
    {
        q_sort(array, 0, arr_len - 1);
    }
    快速排序是比较常用比较算法,先选取中值得时候很重要,本段代码采用中间和首位的数值去中间的值。
时间: 2024-11-08 19:01:52

数据结构之常见的排序算法c语言实现的相关文章

Python全栈开发之5、几种常见的排序算法以及collections模块提供的数据结构

在面试中,经常会遇到一些考排序算法的题,在这里,我就简单了列举了几种最常见的排序算法供大家学习,说不定以后哪天面试正好用上,文章后半段则介绍一下collections模块,因为这个模块相对于python提供的基本数据结构(list,tuple,dict)不被人们所熟悉,但是如果你对他们了解的话,用起来也是非常方便高效的. 排序算法 一.冒泡排序(BubbleSort) 步骤: 比较相邻的元素,如果第一个比第二个大,就交换他们两个. 循环一遍后,最大的数就“浮”到了列表最后的位置. 将剩下的数再次

常见的排序算法

描述: 排序算法可谓数据结构模块中的重中之重,常见的哈希表,二叉树,搜索树/平衡树,位图等数据结构只是处理实际问题的抽象方法,实际在处理接受或生成的数据集时,排序算法显得尤其重要,排序算法家族很庞大,其中包括了冒泡排序,选择排序,插入排序,堆排序,快速排序,归并排序,基数排序,计数排序,希尔排序,箱排序,树型排序等众多算法,每种排序都有各自的特性,没有好坏之分,只有在特定的场景使用合适的排序算法才是上策,单纯的来比显得太过绝对,没有可比性.因为实际需求及各方面条件的限制使得排序算法的可选范围往往

常见的排序算法总结(JavaScript)

引言 排序算法是数据结构和算法之中的基本功,无论是在笔试还是面试,还是实际运用中都有着很基础的地位.这不正直七月,每年校招的备战期,所以想把常见的排序算法记录下来.在本篇文章中的排序算法使用 JavaScript 实现. 一. 冒泡排序 冒泡排序是排序算法中最简单的一个算法,其优点是易理解,易实现.在一些对性能要求不高且数据量不大的需求中,冒泡排序是一个很好的选择. 原理:假设排序顺序为增序,数组长度为 N.数组每相邻两个元素进行比较,大数后移,小数前移,第一轮排序下来就能找到最大的数.也就是比

【转帖】常见的排序算法

常见的排序算法 总结一下常见的排序算法. 排序分内排序和外排序.内排序:指在排序期间数据对象全部存放在内存的排序.外排序:指在排序期间全部对象个数太多,不能同时存放在内存,必须根据排序过程的要求,不断在内.外存之间移动的排序.内排序的方法有许多种,按所用策略不同,可归纳为五类:插入排序.选择排序.交换排序.归并排序.分配排序和计数排序.插入排序主要包括直接插入排序,折半插入排序和希尔排序两种;选择排序主要包括直接选择排序和堆排序;交换排序主要包括冒泡排序和快速排序;归并排序主要包括二路归并(常用

常见比较排序算法的耗时测试

一直知道插入排序在输入规模比较小时会有比较好的效率,但这个输入规模多少才算少却无从知晓,今天特意写了几个小程序分别测试了几种排序算法随输入规模增长的耗时情况. 测试环境 CPU 3.0GHz 双核  1G内存   centos虚拟机 g++ 4.9.1 预先构造100W个随机生成的整数数组,计算使用各种排序算法时的总耗时 插入排序  vs  冒泡排序 不出所料,插入排序基本在任何输入规模均优于冒泡排序. 插入排序  vs 快速排序 vs 归并排序 由下图可以看出,在输入规模小于100时,插入排序

java几种常见的排序算法总结

[java] view plain copy /*************几种常见的排序算法总结***************************/ package paixu; public class PaiXu { final int MAX=20; int num[]=new int[MAX]; { System.out.print("生成的随机数组是:"); for(int i=0;i<20;i++){ num[i]=(int)(Math.random()*100)

常见比较排序算法的比较

几种常见的排序算法之比较 排序的基本概念以及其算法的种类,介绍几种常见的排序算法的算法:冒泡排序.选择排序.插入排序.归并排序.快速排序.希尔排序的算法和分析它们各自的复杂度,然后以表格的形式,清晰直观的表现出它们的复杂度的不同.在研究学习了之前几种排序算法的基础上,讨论发现一种新的排序算法,并通过了进一步的探索,找到了新的排序算法较之前几种算法的优势与不足. 排序算法,是计算机编程中的一个常见问题.在日常的数据处理中,面对纷繁的数据,我们也许有成百上千种要求,因此只有当数据经过恰当的排序后,才

用Java来写常见的排序算法

随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * * @author huwei * */ public class Sort { public static void main(String[] args) { int[] a = { 60, 57, 89, 47, 57, 98, 45, 35, 73 }; Sort sort = new So

常见的排序算法--java版

个人总结的常见的排序算法 public class Sort { // 1.冒泡:稳定,最优O(n) 最差O(n^2) 平均O(n^2) private static void sort1(int[] arr) { for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr.length - 1; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = ar