十三、排序算法
排序算法
算法 一组乱序数据 变成有序数据------>排序 一类问题
列 成绩从高到低排序 个子从高到低
一类问题 可能会有不同的算法
评判算法的好坏 时间复杂度 空间复杂度
排序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.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 }