目录
各个排序的时间复杂度
排序算法在外面初阶段学习过程中,非常常见,当然在以后找工作面试的时候也经常问到,今天为大家介绍四个常见且用到最多的,希望大家能够学习掌握。分别是选择排序、冒泡排序、快速排序和插入排序。
一、选择排序
基本思想:每一趟排序从待排序的记录中选出关键字最小的记录,按顺序放在已排序的记录中,直到全部排完为止。
给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;
}
四个比较经典的排序算法就讲到这里了,如有错误,请大家指出