700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > c语言排序(快速排序 冒泡排序 选择排序 插入排序 桶排序)

c语言排序(快速排序 冒泡排序 选择排序 插入排序 桶排序)

时间:2021-04-25 07:17:14

相关推荐

c语言排序(快速排序 冒泡排序 选择排序 插入排序 桶排序)

快速排序,冒泡排序,选择排序,插入排序,桶排序

文章目录

什么是排序快速排序实现流程代码改进版快速排序代码注意点冒泡排序实现流程实现代码选择排序实现代码插入排序实现代码桶排序实现代码总结这就是一些经典的排序,如果有问题,还请大佬指出。最后希望大家能够越学越好,谢谢你们能够花时间读我这一篇文章。

什么是排序

排序其实就是把一组没有大小顺序的数据,排列成有大小顺序的一组数据。

例子:

学校发的成绩单排名

从矮到高排队

快速排序

快速排序,顾名思义,对比冒泡排序与其他的一些排序,它的速度是很快的。这个排序,是基与分治法思想的排序方法。

基本思想:在无序的一组数据中,寻找一个基准值。把这组数据中,小于基准值的所有数放到它的左边,大于基准值的所有数放到它的右边。

实现流程

(1)寻找一个基准数:(一般为第一个数,理论上这个数可以是任意位置的数),寻找这个数的位置(其实这就是,把比这个数小的往它的左边放,比它大的数往右边放)。

这里我们的基准数为51,我们由 j 往后寻找一个比基准数小的数。这里 -98就是的,所以 j 的标记先停在这里。

(2)我们把 -98 赋给 i 的位置,就是把小于基准数的往左边放了。但是这里我们需要注意,把 -98 给到 i 的位置后,我们需要把下标 i ++,而下标 j 不用动,因为这时候我们是已经把 -98 这个小于基准数的值放到了左边,但是 -98 显然不能放在右边,所以我们把这个位置留着,用来从 i 下标(也就是左边寻找一个比基准数大的数) ,把这个数放进 j 的位置。

(3)这里2比基准数小,所以 i 继续下移。 同理 -4,5,1,2,3,都比基准数小。所以我们的 i 移动到了98

(4)这时候,同理,我们把 i 的值放入 j 的位置,然后 j --,但是我们 i 的位置不能变。 因为还要寻找一个比基准数小的数放入左边。

(5)我们发现 7 比基准数小,于是把 j 指向的值,赋给 i 的位置,i++。

这个时候发现 i == j 了,这个就是我们基准数存放的位置,把基准数放入,我们的第一轮就排序完成了。

(6)然后我们分析,我们其实只是把基准数放到了它的位置,而它的左右两边还不是有序的,所以,我们调用自己这个函数,把基准数左右两边都排序。

代码

#include <stdio.h>void print(int *num,int n)//打印数组元素函数{for(int i = 0;i < n; i++)printf("%d ",num[i]);}void quicksort(int *num, int low, int high)//快速排序函数{if(low > high)//递归调用,为基准数左右两边排序的结束条件return ;int i, j, temp;i = low;j = high;temp = num[i];//获取基准数while(i < j){while(i < j && num[j] > temp)//从右边开始寻找,找到一个小于基准数的位置,然后停下。j--;if(i < j)//这里是,把小于基准数的数放入左边{num[i++] = num[j];}while(i < j && num[i] < temp)//从左边开始寻找,找到一个大于基准数的值停下i++;if(i < j)//把这个大于基准数的值,放入右边{num[j--]=num[i];}}num[i] = temp;//最后i==j的时候,就是基准数该放入的位置quicksort(num,low,i-1);//对基准数左边的数排序quicksort(num,i+1,high);//对基准数右边的数排序}int main() {int num[10]={51,2,-4,5,1,2,3,98,7,-98};quicksort(num,0,9);//排序一列数print(num,10);//打印排序好的值return 0;}

这里提一下,还有一种改进的方法,让这个排序更快。

唯一改变的地方就是,我们的 i 哨兵和 j 哨兵 同时寻找,i 寻找第一个大于基准数的数,j 寻找第一个小于基准数的数,然后交换它们两个的位置,是不是就一步完成了上面两步的寻找呢?

改进版快速排序代码

void quicksort2(int *num,int low ,int high){if(low>high)return ;int i=low,j=high,temp=num[i];while(i<j){while(i<j&&num[j]>temp)j--;while(i<j&&num[i]<temp)i++;if(i<j){int t=num[i];num[i]=num[j];num[j]=t;}}num[j]=temp;quicksort(num,low,i-1);quicksort(num,i+1,high);}

相比第一段代码,这里改变的其实就是寻找 i ,j 的位置,第一段代码是单方向寻找,进行交换。而我们的第二段代码,是从两边寻找,然后进行交换。

注意点

使用第二段代码时,我们需要注意,先要从右边寻找。因为我们只有,把最后一个小于基准数的数,放到基准数左边才是正确的排序。

冒泡排序

实现原理:第一轮,把一组数据中的数,两两进行比较,如果第一个数大于第二个数,交换它们的位置。这样交换一轮后,我们的最大数会被放到末尾。

第二轮,然后我们只需要比较最大数前面的几个数,然后把第二大的数放入最大数的前一个位置。

第三轮:依次类推。

实现流程

(1)我们比较第一个数跟第二个数,发现 9 比 2 大,所以交换。然后同理,这就是我们第一轮结束后的样子。然后下面的几轮,9不再参与排序。

(2)第二轮

(3)第三轮

(4)第四轮

最后完成排序

实现代码

#include <stdio.h>void print(int arry[], int len){for (int i = 0; i < len; i++){printf("%d ", arry[i]);}}void Sort(int *arry,int n){int i,j;int flag=1;for(i=0;i<n-1;i++){for(j=0;j<n-1-i;j++)if(arry[j]>arry[j+1]){int t=arry[j];arry[j]=arry[j+1];arry[j+1]=t;flag=0;}if(flag==1)return ;}}int main(){int arry[15]={7,44,38,99,47,15,36,26,27,2,46,43,19,50,48};Sort(arry,15);print(arry,15);printf("\n");return 0;}

选择排序

基本思路:(例子:降序)首先记录第一个元素的下标,然后使用这个下标,一直更新最小元素的下标。然后把这个下标对应的数放入第一个位置,这样我们就把第一个位置更新成了最小的数了,然后分别去更新后面的数。

实现代码

#include <stdio.h>void print(int arry[], int len){for (int i = 0; i < len; i++){printf("%d ", arry[i]);}}void Sort(int *arry,int n){int i,j,k;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++){if(arry[k]>arry[j])k=j;}if(k!=i){int t=arry[i];arry[i]=arry[k];arry[k]=t;}}}int main(){int arry[15]={7,44,38,99,47,15,36,26,27,2,46,43,19,50,48};Sort(arry,15);print(arry,15);printf("\n");return 0;}

插入排序

主要思路:插入排序,首先会把这个数组看成两个部分。一个是有序部分,另外一个是无序部分。然后,我们利用插入的思想把无序部分的数,一个一个的有序插入进,有序部分,直到所有数据都插入完成。

最后我们就排序完成

实现代码

#include <stdio.h>void print(int arry[], int len){for (int i = 0; i < len; i++){printf("%d ", arry[i]);}}void Sort(int *arry,int n){int i,j,t;for(i=1;i<n;i++)//默认第一个元素为有序元素 {t=arry[i];j=i-1;while(j>=0&&arry[j]>t)//插入排序关键 {arry[j+1]=arry[j];j--;}arry[j+1]=t;}}int main(){int arry[15]={7,44,38,99,47,15,36,26,27,2,46,43,19,50,48};Sort(arry,15);print(arry,15);printf("\n");return 0;}

桶排序

主要思路:建立一个数组,把无序数组中出现的数利用下标,进行标记。最后遍历标记数组,输出被标记的部分。

但是这里注意,因为这是简单版的桶排序,我们只能对有下标存在的序列进行排序。

实现代码

#include <stdio.h>int book[20];void Sort(int *arry,int n){for(int i=0;i<n;i++)book[arry[i]]++;}int main(){int arry[11]={1,5,6,3,4,7,0,2,1,8,1}; Sort(arry,11);for(int i=0;i<9;i++){while(book[i]!=0){printf("%d ",i);book[i]--;}}return 0;}

总结

这就是一些经典的排序,如果有问题,还请大佬指出。最后希望大家能够越学越好,谢谢你们能够花时间读我这一篇文章。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。