五大排序算法

文章目录

  • 前言
  • 五大算法介绍
    • 1.冒泡算法
    • 2.快速排序
    • 3.插入算法
    • 4.希尔算法
    • 5.选择算法
  • 例题讲解

  • 性能比较
  • 总结





前言

排序算法(Sorting algorithm)是一种能将序列按照某种特定排序方式进行排列的一种算法,下面简要介绍其中五种排序算法。


五大排序算法




1.冒泡排序


冒泡排序是一种较简单的排序算法,又称起泡排序。其基本思路是,每次将相邻的两个,每次比较一轮,总会找到序列中最大的一个或最小的一个。最终可以得到一个递增数列或者递减数。

核心过程

void Bubble_sort(int a[],int n)
 {
	 int i,j,temp;
	 for(i=0;ia[j+1])
			 {
				 temp=a[j];
				 a[j]=a[j+1];
				 a[j+1]=temp;
			 }
		 }
	 }
 }

2.快速排序

快速排序是基于冒泡排序的改进方法,其基本思路为:先在未排序的序列选择一个值,以该值为基准数,将序列一分为二,小于基准数的放于左边,大于基准数的放于右边,重复上述操作,当个区间只有一个数时结束。

核心过程

void quick_Sort(int a[], int low, int high)
{
        if (low > high)
        {
                return;
        }
        int i = low, j = high, temp = a[i];//temp为基准数
        while (i < j)
        {
                while (temp < a[j] && i < j){
                        j--;
                }
                if (i < j){
                        a[i++] = a[j];
                  }
                while (temp>a[i] && i < j){

                        i++;
                     }
                if (i < j){
                        a[j--] = a[i];
                    }
        }
        a[i] = temp;
		//递归调用
        quick_Sort(a, low, i - 1);
        quick_Sort(a, i + 1, high);
}


 

3.插入排序


 插入排序是一种简单的排序算法,即在有序序列中,插入一些数据且插入后序列依旧为有序序列。

核心过程

void insertion_sort(int arr[], int n){
        int i,j,k;
        for (i=1;i=0) && (arr[j]>k)) {
                        arr[j+1] = arr[j];
                        j--;
                }
                arr[j+1] = k;
        }
}

4.希尔排序


希尔排序是基于插入排序而提出的方法的,其基本思想是:先将整个未排元素序列切割成分成若干个子序列,确定步长并分别进行插入排序,再减少一半步长同时进行上述操作,当每个子序列长度为1时,再进行一次插入排序,便可得到有序的序列。

核心过程

void shellSort(int a[], int len)
{
    int i, j, k, temp, SL;  // 设SL为希尔步长
    for (SL = len / 2; SL > 0; SL /= 2)  // 设置希尔步长的初始值为len的二分之一,完成一次遍历之后,步长减少一半
	{  
    	for (i = 0; i < SL; ++i)  //  i 为每次分组的第一个元素下标 
		{ 
	        for (j = i + SL; j < len; j += SL) //对步长为SL的元素进行插入排序,当SL为1时,再进行直接插入排序
			{ 
	            temp = a[j];  
	            k = j - SL;  
	            while (k >= 0 && a[k] > temp) {
	                a[k + SL] = a[k]; 
	                k -= SL;
	            }
	            a[k + SL] = temp; 
	        }
	    }
    }
}

5.选择排序


选择排序是一种简单直观的排序算法,其基本思路:先在未排序的序列中找到最小(大)元素,并存放到序列的起始位置,再从剩余的未排序排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。一直重复上述过程,直到所有排序完成。

核心过程

void select_sort(int a[],int n)    
{
    int i,j,k,temp;   
    for(i=0;i


例题讲解

将下列数列进行排序 a[20]={30,-19,-29,39,2,4,8,28,-3,40,51,39,78,43,20,31,27,55,68,21};

插入排序解法:

#include 

void select_sort(int a[],int n)    
{
    int i,j,k,temp;   
    for(i=0;i

快速排序解法

#include 

void quick_Sort(int a[], int low, int high)
{
        if (low > high)
        {
                return;
        }
        int i = low, j = high, temp = a[i];//temp为基准数
        while (i < j)
        {
                while (temp < a[j] && i < j){
                        j--;
                }
                if (i < j){
                        a[i++] = a[j];
                  }
                while (temp>a[i] && i < j){

                        i++;
                     }
                if (i < j){
                        a[j--] = a[i];
                    }
        }
        a[i] = temp;
		//递归调用
        quick_Sort(a, low, i - 1);
        quick_Sort(a, i + 1, high);
}

int main()
{

        int a[20]={30,-19,-29,39,2,4,8,28,-3,40,51,39,78,43,20,31,27,55,68,21};
        quick_Sort(a,0,20);
		for (int i=0;i<20;++i)
		{
			printf("%d ",a[i]);
		}

        printf("\n");
        return 0;
}        

运行结果显示:


 性能比较


排序算法 时间复杂度(平均情况) 时间复杂度(最好情况) 时间复杂度(最坏情况) 稳定性
冒泡排序 O(n^2) O(n) O(n^2) 稳定
快速排序 O(nlogn) O(nlogn) O(n^2) 不稳定
插入排序 O(n^2) O(n) O(n^2) 稳定
希尔排序 O(nlogn)~O(n^2) O(n^1.3) O(n^2) 不稳定
选择排序 O(n^2) O(n^2) O(n^2) 不稳定




总结

冒泡算法,快速排序,插入算法,希尔算法和选择算法都是排序算法中常用的算法,其时间复杂度有所区别,当考虑算法的时间复杂度时,要合理的选择适当的排序算法。

你可能感兴趣的:(排序算法,算法,c语言,蓝桥杯)