十三、排序算法

排序算法

算法 一组乱序数据 变成有序数据------>排序 一类问题

列 成绩从高到低排序 个子从高到低

一类问题 可能会有不同的算法
评判算法的好坏 时间复杂度 空间复杂度

排序n个数据 --->时间和n的关系 空间和n的关系

算法和编程语言 算法-->解决问题的方法 可以用c语言写代码 也可以用其他语言
算法和数据结构 排序 数据进行排序 数据的存放方式 影响代码的实现效率


数据结构 组织和存放数据的方式 作用 管理数据 --->影响操作方式
算法 处理数据

算法+数据结构 = 程序

同一种算法 最后写出的代码也可能不一样

1.冒泡 从头到尾比较相邻的元素 如果排序和要排序方式不一样 就交换两个元素
经过一轮比较后会让最大的数字沉到末尾

2.选择 每次从剩下的元素中找到最小的元素 和后面的文件进行交换

3.插入 先把第一个数字视为优秀 后面一个个插入到有序的序列当中

4.快速 知道一轮的步骤就行

先选中一个数字 把比这个数字更大的放到右边 更小的放到左边
把数组一分为2 ---->对两边再调用递归排序

数组一分为2 对两边进行单独排序 ---->有序

头文件进行函数声明

 1 #pragma once
 2 
 3 #include<stdio.h>
 4 
 5 void printArr(int arr[],int len);//参数是数组名和数组大小  打印一个数组里面所有内容
 6 
 7 void bulletSort(int arr[],int len);//冒泡排序定义
 8 
 9 void selectSort(int arr[],int len);//选择排序定义
10 
11 void insertSort(int arr[],int len);//定义插入排序
12 
13 void quickSort(int arr[],int left,int right);//快速排序
sort.h

sort.c函数的调用

 1 #include "sort.h"
 2 
 3 void printArr(int arr[],int len){
 4     int i;
 5     for (i=0;i<len;i++)
 6     {
 7         printf("%d\t",arr[i]);
 8     }
 9     printf("\n");
10 }
11 void bulletSort(int arr[],int len)
12 {
13     int i,j;
14     for (i=0;i<len-1;i++)
15     {//这里-i的目的是因为有一个数字沉底  这个数字不参与后续的比较
16         for (j=0;j<len-i-1;j++)
17         {
18             if (arr[j]>arr[j+1])//前面比后面大
19             {
20                 int temp=arr[j];
21                 arr[j]=arr[j+1];
22                 arr[j+1]=temp;
23             }
24         }
25     }
26 }
27 
28 void selectSort(int arr[],int len)
29 {
30     int i,j,k,temp;;
31     for (i=0;i<len-1;++i)
32     {
33         k=i;
34         for (j=i+1;j<len;++j)
35         {
36             if (arr[j]<arr[k])
37             {
38                 k=j;//k保持最小元素的下标
39             }
40         }
41         //用最小元素  arr[k] 和arr[i] 进行交换`
42         temp=arr[k];
43         arr[k]=arr[i];
44         arr[i]=temp;
45     }
46 }
47 
48 void insertSort(int arr[],int len)//插入排序
49 {
50     int i,temp,j;
51     for (i=1;i<len;++i)
52     {
53         temp=arr[i];
54         j=i-1;
55         while (j>=0&&arr[j]>temp)
56         {
57             arr[j+1]=arr[j];//把这个数据往后移动
58             --j;
59         }
60         arr[j+1]=temp;//插入到第一个比他小的元素后面
61     }
62 }
63 
64 
65 void quickSort(int arr[],int left,int right)
66 {
67     int i,j;
68     int temp;
69     if (left>=right) return;
70     //排序的是[left,right]这个区间的元素
71     //left>right 说明没有元素
72     //left==right 只有一个元素  不需要排序
73     //选中的数字是 arr[left] 把比这个元素大的 放右边  比他小的放左边
74 
75     //数组一份为2
76     i=left;
77     j=right;
78     while (i<j)
79     {
80         while(i<j&&arr[left]<arr[j]) --j;
81         while(i<j&&arr[left]>=arr[j]) ++i;
82         if (i<j)
83         {
84             temp=arr[i];
85             arr[i]=arr[j];
86             arr[j]=temp;
87         }
88     }
89     //当i==j时  i所在位置就是 arr[left]应该在的位置
90     temp=arr[left];
91     arr[left]=arr[i];
92     arr[i]=temp;
93     //对这两个部分单独排序
94     quickSort(arr,left,i-1);
95     quickSort(arr,i+1,right);
96 }

主方法  调用声明函数

 1 #include <stdio.h>
 2 #include "sort.h"
 3 int main()
 4 {
 5     int arr[10]={3,4,2,7,5,3,1,6,8,6};
 6     bulletSort(arr,10);
 7     selectSort(arr,10);
 8     insertSort(arr,10);
 9     quickSort(arr,0,9);
10     printArr(arr,10);
11     getchar();
12     return 0;
13 }

猜你喜欢

转载自www.cnblogs.com/liugangjiayou/p/11808491.html
今日推荐