经典排序算法总结与实现

数据结构和算法其实很重要,无论是哪种语言都会用到它们,今天博主就来总结一下常用的七种排序算法,便于简单阅读,就c语言来实现了。

每个算法都按照从小到大排序。

冒泡排序(Bubble Sort)

原理

冒泡排序是一种简单的排序方法,通过每次重复访问原数列,每次只比较两个元素,如果前一个比后一个大,则调换两个元素位置。通过重复此步骤,每个循环就将最大的元素“冒泡”到队尾了。

步骤

1、从首元素开始,比较相邻两个元素的大小,如果前一个元素大与后一个元素,就将两个元素调换位置。 2、对数列中每一对元素进行相同操作,从第一对到最后一对,第一个循环结束时,即可将数列中最大的元素放置队尾。 3、重复操作2,每个循环找出一个最大的元素,比较过的元素不予循环。 4、持续每次对越来越少的元素进行对比,直至没有任何一对元素没有对比过时,排序结束。

实现

void BubbleSort(int arr[],int a){
    int i,j;
    i = n;
    bool flag = true;
    while(flag){
        flag = false;
        for(j = 1;jarr[j]){ swap(arr[j-1],arr[j]); flag = true; } } i--; } }

上面的代码中用flag来标记是否有数据交换,如果在排序过程中没有数据交换就说明是已经排好的顺序,后面的就不用遍历了。冒泡排序虽然简单,但是效率低下,数据量大点的排序就不可以使用了。

插入排序(Insertion Sort)

原理

插入排序时一种直观的排序方法,通过建立新的一个数列作为有序数列,将原数列中的元素从前往后依次有序的插入有序数列(新数列)中。在有序数列中从后往前扫描,来判断将原数列中的元素插入到有序数列中的位置。在实现过程中需要将有序数列中的元素不断的向后移动,为插入的新元素留出位置。

步骤

1、将元素列中的第一个元素插入新数列的第一位,该元素可以看作已经排序。 2、在原数列中去处第二个元素,在有序数列中从后往前扫描。 3、如果有序数列中的元素大于新元素时,将其向后移动一位。 4、重复步骤3,直至找到小于或等于新元素的已排序元素的位置。 5、将新元素插入到该位置。 6、重复步骤2~5,直至原数列中所有元素都插入到新数列中。

实现

void InsertSort(int arr[],int n){
    int i,j;
    for(int i = 0;i0&&j

插入排序依旧不适合用于数据量比较大的排序,但是如果数据量很小,在1000左右的话,插入排序是个不错的选择。

选择排序

原理

选择排序和插入排序很像,插入排序是将数据插入有序数列,而选择排序是将未排序的数列中最小的元素放在数列的起始位置,然后在次从未排序的数列中找取最小的元素,放置在已排序的数列的尾部,反复重复,直到所有元素排序完成。

步骤

1、初始时,数列全为无序的,无序区为a[0,n-1],令i=0; 2、在无序区a[i,n-1]中选取最小的元素,将其与a[i]数值互换,之后得到两个分区 3、i++并重复第二步直到i==n-1。

实现

void SelectSort(int arr[],int n){
    int i,j,min;
    for(i = 0;ia[j])
                min = j;
        }
        if(min != i){
            swap(arr[i],arr[min]);
        }
    }
}

选择排序中如果某个元素位于正确的位置,则不会被移动。选择排序每次移动一对元素,至少有一个被移动到正确的位置,因此对n个元素的表进行排序最坏情况要进行n-1次,在所有完全依靠交换去移动排序的方法中,选择算法算是一种比较好的方法。

原文链接:http://t.cn/RyfbFWy

点赞