基于数组的排序算法

来源:互联网 发布:python日常实用小脚本 编辑:程序博客网 时间:2024/06/11 11:19

常用的基于数组的排序算法代码详解(一)

在完成各个排序的代码前,先完成一个交换函数和打印函数。

void show(int *arr,int len){    //循环打印数组    for(int i = 0;i < len;i++)    {        printf("%d ",arr[i]);    }    printf("\n");} //交换函数static void swap(int *p,int *s){    int tmp;    tmp = *p;    *p = *s;    *s = tmp;}
sort.h中的函数声明#ifndef _SORT_H_#define _SORT_H_void exchange_sort (int *arr,int len);void bubble_sort(int *arr,int len); void bubble_sort_ex(int *arr,int len);void select_sort(int *arr,int len);void insert_sort(int *arr,int len);void insert_sort_ex(int *arr,int len);void shell_sort(int *arr,int len);int partition(int *arr,int left,int right);void quick(int *arr,int left,int right);void quick_sort(int *arr,int len);void quick_sort_stack(int *arr,int len);void heap_sort(int *arr,int len);void meger_sort(int *arr,int len);void show(int *arr,int len);int *get_arr(int len);#endif

1,交换排序
空间复杂度:O(1) 时间复杂度:O(n^2)
思路:序列中的元素不断交换,第1个元素的值与后面的所有元素的值比较大小,如果其中一个值比第1个值小,进行交换。依次类推,再将第2个元素与后面的所有元素比较交换,直到n-1个元素为止。时间复杂度较高,最终达到序列有序。

 void exchange_sort (int *arr,int len) {     for(int i = 0;i < len-1;i++)     {         for(int j = i+1;j < len;j++)         {             if(arr[i] > arr[j])             {                 swap(&arr[i],&arr[j]);             }         }     } }

2,冒泡排序:
空间复杂度:O(1) 时间复杂度:O(n^2)
思路:将序列当中的左右元素,依次比较,始终保证右边的元素始终大于左边的元素;( 第一轮结束后,序列最后一个元素一定是当前序列的最大值;)对序列当中剩下的n-1个元素再次执行上述步骤。对于长度为n的序列,一共需要执行n-1轮比较(利用while循环可以减少执行次数)

void bubble_sort(int *arr,int len);{    for(int i = 0;i<len-1;i++)    {        for(int j = 0;j<len-1-i;j++)        {            if(arr[j] > arr[j+1])            {                swap(&arr[j],&arr[j+1]);            }        }}//冒泡排序改进void bubble_sort_ex(int *arr,int len){    bool flag = true;    for(int i = 0;i<len-1 && flag;i++)    {        flag = false;        for(int j = 0;j<len-1-i;j++)        {            if(arr[j] > arr[j+1])            {                swap(&arr[j],&arr[j+1]);                flag = true;            }        }}

3,选择排序
空间复杂度:O(1) 时间复杂度:O(n^2)
思路:比较+交换。从待排序序列中,假设第一个数为最小值,将其与剩余元素进行比较,用下标变量k来记录最小数所在的元素的下标。一趟比较完成后,将arr[0]与arr[k]进行交换。然后设第2位存放次小的数,依次类推。

int min = arr[0];    int min_index = 0;    int i;    int j;    for(i = 0;i<len - 1;i++)    {        min = arr[i];        min_index = i;        for(j = i+1;j<len;j++)        {            if(min > arr[j])            {                min = arr[j];                min_index = j;            }        }        if(i != min_index)        {            swap(&arr[j],&arr[min_index]);        }    }

4,插入排序
空间复杂度:O(1) 时间复杂度:O(n^1.5)/O(n^2)
思路:思路:直接插入排序的核心思想就是:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过。

void insert_sort_ex(int *arr,int len){    int tmp;    int i;    int j;    for(i = 1;i < len;i++)    {        tmp = arr[i];        for(j = i - 1;j >= 0;j--)        {            if(tmp > arr[j])            {                break;            }        }    }}

以上是四种排序的代码详解,若存在问题,欢迎指正。

原创粉丝点击