经典排序算法(选择、冒泡、快速、插入)

目录

一、选择排序

二、冒泡排序

三、快速排序

四、插入排序 


        各个排序的时间复杂度

 排序算法在外面初阶段学习过程中,非常常见,当然在以后找工作面试的时候也经常问到,今天为大家介绍四个常见且用到最多的,希望大家能够学习掌握。分别是选择排序、冒泡排序、快速排序和插入排序。

一、选择排序

基本思想:每一趟排序从待排序的记录中选出关键字最小的记录,按顺序放在已排序的记录中,直到全部排完为止。

给0位置定序,遍历数组0->N-1,找出最小的与0位置的元素交换,然后给1位置定序,找出1->N-1中最小的和1位置交换,依次往下。

 实现代码:

//选择排序
#include <stdio.h>
int i,j; 
int select_sort(int arr[], int N )
{ 
	for(i=0; i<=N-2;i++){
		int min=i;
		for(j=i;j<=N-1;j++){
			if(arr[j]<arr[min]){
				min=j;
			}
		}
		int temp=arr[min]; arr[min]=arr[i];arr[i]=temp;
	}
	return 0;
}		

int main()
{
	int arr[]= {45,69,32,45,23,12,89,98,110,2,48,96};
	select_sort(arr,sizeof(arr)/sizeof(arr[0]));
	for(j=0; j<sizeof(arr)/sizeof(arr[0]);j++){
		printf("%d ",arr[j]);
	}
	printf("\n");
	
}

二、冒泡排序

在待排序的数组中,相邻的两个元素两两比较,较大的数就会与较小的数进行交换,排列在后面

//冒泡排序
#include <stdio.h>

int bubble_sort(int arr[],int N)
{
	int i,j;
	for(i=0; i<N-1 ; i++){
		for(j=0; j<N-1-i;j++){//第二轮开始最后一个数不做比较 
			if(arr[j+1] < arr[j] ){
				int temp=arr[j+1];arr[j+1]=arr[j];arr[j]=temp;
			}
		}
	}
	
	return 0;
}

int main()
{
	int arr[]= {45,69,32,45,23,12,89};
	bubble_sort(arr,sizeof(arr)/sizeof(arr[0]));
	int i;
	for(i=0; i<sizeof(arr)/sizeof(arr[0]);i++){
		printf("%d ",arr[i]);
	}
	printf("\n");
	}

三、快速排序

从无序数据中找一个作为基准,通过特定的方法把小于基准的都放到左边,把大于基准的放到右边

实现代码:

#include <stdio.h>

#define N 10

//快速排序
void quick_sort(int num[], int start, int end )
{
    int i,j,temp;
    int key;

    i = start;
    j = end;
    key = num[start];   //任命为中间分界线,左边比他小,右边比他大,通常第一个元素是基准数

    if(i > j)  //如果下标i大于下标j,函数结束运行
    {
        return 0;
    }

    while(i != j)
    {
        while(num[j] >= key && j > i)   
        {
            j--;
        }

        while(num[i] <= key && j > i)
        {
            i++;
        }

        if(j > i)
        {
            temp = num[j];
            num[j] = num[i];
            num[i] = temp;
        }
    }

    num[start] = num[i];
    num[i] = key;

    quick_sort(num,start,i-1);
    quick_sort(num,i+1,end);
}

int main(int argc , char **argv)
{
    //创建一个数组
    int num[N] ={0};
    int i;

    printf("请输入十个无序的数\n");
    for(i =0; i < N; i++)
    {
        scanf("%d",&num[i]);
    }

    quick_sort(num, 0, N-1);

    for(i = 0; i < N; i++)
    {
        printf(" %d ", num[i]);
    }

    return 0;
}




四、插入排序 

插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。 按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。

下面给大家举个例子,在pre和q之间插入p,u,采用链表来实现

实现代码

#include<stdio.h>
#include <string.h>
#include <stdlib.h>


struct node {
	int val;
	struct node *next;
};


struct node   head;
struct node *pthead = &head; 
struct node *pttail = &head; 

void list_travel(struct node *pthead)
{
	struct node *p = pthead->next;

	while(p){
		printf("%d ",p->val);
		p=p->next;
	}

	printf("\n");
}

void list_insert_sort(struct node *pthead)
{
	struct node *p = pthead->next;
	pthead->next = NULL;

	while( p ) {
		/*将p 插入到 有序的 list中  方法就是插在rq之间  */
		struct node *pre = pthead;
		struct node *q = pthead->next; 
		//遍历q,直到 q->val > p->val ,插在q前面
		while( q  &&   ( q->val <= p->val  )    )  {
			q=q->next;
			pre=pre->next;
		}
		/*
			情况1  q==NULL,链表结束了,没找到  
			情况2  q->val <= p->val ,找到了
			
			都可以使用下面的代码 
			插入p到 r q之间,  记得提前备份 p->next  
		*/
		struct node *u = p->next; 
		p->next=q;pre->next=p;

		p=u;//开始插入下一个 
	}	
}



int main(void)
{
	
	int arr[ 9 ] ={56,33,29,87,98,21,64,53,85};
	struct node *p;


	pthead->next = NULL;

	/* create list   , by append node  at tail */
	for(int i=0;i<9;i++)   {
		p=malloc(  sizeof(*p)  );
		p->val = arr[i];   p->next = NULL;
		
		// append , add node at tail 
		pttail->next = p; 	
		pttail = pttail->next;  //p;
	}


	//travel 
	printf("### origin list:  ");
	list_travel(pthead);
 
 
	//insert sort list 
	list_insert_sort(pthead);
 	printf("### sort list:  ");
	list_travel(pthead);

	return 0;
}

四个比较经典的排序算法就讲到这里了,如有错误,请大家指出

猜你喜欢

转载自blog.csdn.net/qq_53676406/article/details/128924645