版权声明:谢谢 https://blog.csdn.net/Waybyway/article/details/83097073
部分方法来自我关注的博主 J_小浩子 谢谢
1 桶排序 bucketsort
1 桶排序
#include <stdio.h>//桶排序基本说明
int main(){
int data1[11]={0},temp,i,j;
// num=11 所以桶排序只能用来输入和储存0-10 之间的数 字//data1【11】={0}让数组元素的初始数值 初始化为0
for(i=0;i<11;i++){
scanf("%d",&temp);
// 以temp作为输入介质 输入的0-10之间的数字 输入给temp对应的数组data1【temp】会加1
data1[temp]++;
//数组像是一个木桶一样 储存输入的0-10 之间数字的数量
}
for(i=0;i<11;i++){
// i作为引导 从0走到10
for(j=0;j<data1[i];j++){
//j用来检测 data1【i】的值,大于0则可以输出,按照data1【i】的值即木桶的数量输出次数
printf("%d ",i);
}
}
return 0;
}
//方法来自 啊哈算法 时间复杂度O(n=11) ,O(n)
2 冒泡排序 bublesort
#include <stdio.h>
void bublesort(int data[],int n);//冒泡排序基本说明是 void的部分 //
//此题为啊哈算法 小哼买书的冒泡排序解法
int main(){
int n,i,j,temp;
scanf("%d",&n);
int data1[n];
for(i=0;i<n;i++){
scanf("%d",&data1[i]);
}
bublesort(data1,n);
printf("%d",data1[0]);
for(i=1;i<n;i++){
if(data1[i]!=data1[i-1]){
printf(" %d",data1[i]);
}
}
return 0;
}
void bublesort(int data[],int n){ // 基本冒泡排序说明 需要数组和数组元素数 N
int i,j,temp;
//i,和 J用来检查数组 按照从小往大方向排序,temp用来做替换介质
for(i=0;i<n-1;i++){
//共N个元素 所以最多比较n-1次,如两个元素 最多比较一次
for(j=0;j<n-i-1;j++){
//J从 开始项找 最多寻找n-i-1次 (最多n-1次比较,i每+1,就排好一个本趟中最大的元素,就只剩下n-i-1个需要比较的了,
//且初始是i为0 第一次可以减0,第一次以后 最大的元素在最后面,需要比较的元素个数为 (n-1)-1
//所以最多进行n-i-1次往后查找)
if(data[j]>data[j+1]){
//因为按照从小往大排序 发现前一项大于后一项 就交换他们两个
temp=data[j+1];
data[j+1]=data[j];
data[j]=temp;
}
}
}
return;
}
3 选择排序 selectsort
#include <stdio.h>
void selectsort(int data[],int n);//基本选择排序 利用数组和数组元素数
int main(){
int i,n;
scanf("%d",&n);
int data1[n];
for(i=0;i<n;i++){
scanf("%d",&data1[i]);
}
selectsort(data1,n);
for(i=0;i<n;i++){
printf("%d ",data1[i]);
}
system("pause");//用于暂停
return 0;
}
void selectsort(int data[],int n){
int i,j,mini,temp;
for(i=0;i<n-1;i++){ //一共n项元素,所以最多需要排序 n-1次
mini=i; // 假设每一次 最小项的下标mini是 i,按照从小往大排序
for(j=i+1;j<n;j++){
if(data[j]<data[mini]){
// j=i+1 因为假设第i项是最小的 所以从i想后的 每一项寻找有没有比i更小的元素
mini=j;
//那么检测 i项后面 有没有比data【mini=i】更小的项,如果有 就把mini下标标记成更小的
}
}
if(i!=mini){
//如果 i!=mini说明 i不是最小项,mini被替换过,所标记项才是最小项
temp=data[i];
//把最小项放到前面,较大项放到后面,这样把他们交换过来,按照从小往大排序
data[i]=data[mini];
data[mini]=temp;
}
}
return;
}
4 快速排序 quicksort
#include <stdio.h>
int data1[100],n;
void quicksort(int left,int right);//快速排序
int main(){
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&data1[i]);//读入数组 共n项,从1到N项
}
quicksort(1,n);//对数组 1到N 进行快速排序,输出演示,暂停
for(i=1;i<=n;i++){
printf("%d ",data1[i]);
}
system("pause");
return 0;
}
void quicksort(int left,int right){
int i,j,t,temp;
//I , J,反别负责从左到右,从右往左遍历查找
if(left>right){
//如果所给位置错误 右边序号小于左边,返回错误,结束
return;
}
temp=data1[left];
//temp储存首项——基准数,i为左,J为右,遍历
i=left;
j=right;
while(i!=j){
//两者未相遇,想让J从右边找到一个小于基准数的数字
while(data1[j]>=temp && i<j){ //必须让右边先找一个小于基准数字的数
j--;
}
while(data1[i]<=temp && i<j){
//再让I从左边找到一个大于基准数的数字
i++;
}
if(i<j){
//因为这两者I J没有相遇,所以将他们两个交换 T取后面数值,后面数字=前面数字,前面数字=T
t=data1[j];
// 基准数字为6*****73**** 假设i位置为 7 J位置为 3 所以交换,下一次相遇3 和基准数6交
data1[j]=data1[i];
// 6********87****正常 6**********i 58 j *********5 6交换
data1[i]=t;
}
}
data1[left]=data1[i];
//当i,和J相遇之后说明除了 首项基准数 之外就只有 相遇除的数字不合理,,
data1[i]=temp;
//所以将 基准数 相遇处数字交换
quicksort(left,i-1);//同理 递归操作处理基准数字左边 基准数字右边
quicksort(i+1,right);
return;
}
2018-10.16 第一篇博客 10.17完善
由于算法入门所以废话和解释较多
加油,哈哈哈,冲鸭!!!!!!