冒泡排序:
排序思路:
1.从第0个元素开始,每次用相邻的两个元素进行比较
2.一旦发现后面的一个元素小于我们前面的一个元素就交换位置
3.经过一轮冒泡排序比较之后最后一个元素就是最大值
4.排除最后一个元素,以此类推,每次比较完成后最大值都会出现在
被计较所有元素的最后一个位置,直到当前元素没有可比较的,冒泡
排序完成
冒泡排序:
374261
冒泡
一趟冒泡排序
1.[37]4261
因为3<7所以不用交换
3742612.3[74]261
因为7>43472613.34[72]61
因为7>23427614.342[76]1
因为7>63426715.3426[71]
因为7>1342617
二趟冒泡排序:
342617[34]26173[42]61732[46]17324[61]7324167
三趟排序冒泡排序:
324167[32]41672[34]16723[41]67231467
四趟冒泡排序:
[23]14672[31]467213467
五趟冒泡排序
123467
作用:把当前待比较的数组中的最大值放到最后面
#include<stdio.h>#include<stdlib.h>/* run this program using the console pauser or add your own getch, system("pause") or input loop */voidbubble(int arr[],int n)//函数里面按传递我们的数组和数组长度{int i;int temp;for(i=0;i<n-1;i++){//如果数组中前面的一个原素大于数组中后面的一个元素,就进行交换if(arr[i]>arr[i+1]){
temp = arr[i];
arr[i]= arr[i+1];
arr[i+1]= temp;}}}// void bubbleSort(int arr[],int n)// {// bubble(arr,n);//经过冒泡排序之后,最大的树放到了最后面,此时只需要对数组的前n-1个数排序就可以了// bubble(arr,n-1);// bubble(arr,n-2);// .....// bubblr(arr,1);// }voidbubbleSort(int arr[],int n){int i;for(i=n;i>=1;i--){bubble(arr,i);}}intmain(int argc,char*argv[]){int arr[]={3,2,4,1,6,7};int i;bubbleSort(arr,6);for(i=0;i<6;i++){printf("%d\n",arr[i]);}return0;}
#########################################################################################
#include<stdio.h>#include<stdlib.h>/* run this program using the console pauser or add your own getch, system("pause") or input loop */intmain(int argc,char*argv[]){int a[6]={3,2,4,1,6,7};//6个数的无序数列int i,j,t;for(i=0;i<6-1;i++)//6个数的数列总共需要扫描6-1次{for(j=0;j<6-i-1;j++)//每一趟扫描到a[n-i-2]与a[n-1-1]比较为止结束{if(a[j]>a[j+1])//前面一位数比后一位数大的话,就交换两个数的位置{
t = a[j+1];
a[j+1]=a[j];
a[j]=t;}}}for(i=0;i<6;i++){printf("%d ",a[i]);}return0;}
#######################################################################################
#include<stdio.h>#include<stdlib.h>/* run this program using the console pauser or add your own getch, system("pause") or input loop */voidbubbleSort(int arr[],int n){int i,j,temp;for(i=0;i<n-1;i++)//控制比较的次数{for(j=0;j<n-1-i;j++)//控制每轮比较的次数{if(arr[j]>arr[j+1])//交换两个元素的条件{
temp = arr[j];
arr[j]= arr[j+1];
arr[j+1]= temp;}}}}voidpirnt(int arr[],int n){int i;for(i=0;i<n;i++){printf("%d\n",arr[i]);}}intmain(int argc,char*argv[]){int arr[6]={3,4,2,6,1,7};bubbleSort(arr,6);pirnt(arr,6);return0;}
def bubble(arr,n):
i =0while i<n-1:
# 如果数组中前面的一个原素大于数组中后面的一个元素,就进行交换
if(arr[i]>arr[i+1]):
temp = arr[i]
arr[i]= arr[i+1]
arr[i+1]= temp
i +=1#defbubbleSort(arr,n):#bubble(arr,n)
#//经过冒泡排序之后,最大的树放到了最后面,此时只需要对数组的前n-1个数排序就可以了#bubble(arr,n-1)
# ....#bubble(arr,1)
def bubbleSort(arr,n):
i = n
while i>=1:bubble(arr,i)
i -=1
arr =[3,2,4,1,6,7]bubbleSort(arr,6)for element in arr:print(element,end="\t")
###############################
# 六个数的无序数列
a =[3,2,4,1,6,7]
i =0while i <6-1:#6个数的数列总共需要扫描6-1次
j =0while j <6-i-1:# 每一趟扫描到a[n-i-2]与a[n-1-1]比较为止结束
if a[j]> a[j+1]:#前面一位数比后一位数大的话,就交换两个数的位置
t = a[j +1]
a[j +1]= a[j]
a[j]= t
j +=1
i +=1for element in a:print(element,end="\t")
#########################
def bubblesort(a,n):
i =0while i < n -1: # 6个数的数列总共需要扫描6-1次
j =0while j < n - i -1: # 每一趟扫描到a[n-i-2]与a[n-1-1]比较为止结束
if a[j]> a[j +1]: # 前面一位数比后一位数大的话,就交换两个数的位置
t = a[j +1]
a[j +1]= a[j]
a[j]= t
j +=1
i +=1
a =[3,2,4,1,6,7]bubblesort(a,6)for element in a:print(element,end="\t")
选择排序:
找出最大值与最后一个元素交换
3742611.7和1进行交换
[31426]72.6已经是数组当中的最大值,且在待排序数组的最后一个位置
[3142]673.4和2进行交换
[312]4674.3和2进行交换
[21]34675.2 和 1进行交换
123467#include<stdio.h>#include<stdlib.h>/* run this program using the console pauser or add your own getch, system("pause") or input loop */// int findMax(int arr[],int n)//其实我们找的不是最大值,而是最大值的下标// {// int max = arr[0];// int i;// for(i=0;i<n;i++)// {// if(arr[i]>max)// {// max = arr[i];// }// }// return max;// }intfindMaxPos(int arr[],int n){int max = arr[0];int pos =0;int i;for(i=0;i<n;i++){if(arr[i]>max){
max = arr[i];
pos = i;}}return pos;}voidselectionSort(int arr[],int n){while(n>1){int pos =findMaxPos(arr,n);int temp = arr[pos];
arr[pos]= arr[n-1];
arr[n-1]= temp;
n--;}}intmain(int argc,char*argv[]){int arr[]={3,4,2,6,1,7};selectionSort(arr,6);int i;for(i=0;i<6;i++){prinf("%d\n",arr[i]);}return0;}
##### # def findMax(arr,n):#其实我们不是找最大值,而是找最大值的下标
#max= arr[0]#fori in range(n):#if(arr[i]>max):#max= arr[i]#returnmax
def findMaxPos(arr,n):#其实我们不是找最大值,而是找最大值的下标
max = arr[0]
pos =0for i in range(n):if(arr[i]>max):
max = arr[i]
pos = i
return pos
def selectionSort(arr,n):while n >1:
pos =findMaxPos(arr,n)
temp = arr[pos]
arr[pos]= arr[n-1]
arr[n-1]= temp
n -=1
arr =[3,4,2,6,1,7]selectionSort(arr,6)for i in range(6):print("%d"% arr[i])
插入排序:
3674215
分为两个部分,一个部分已经排好序,一个部分还没有排好序
[367]4215
从4开始插入到我们前面已经排好序的数组中
写代码:
arr 0123 i
3674 key
while(arr[i-1]>key){=>arr[i]= arr[i-1];
i--;}
arr[i]= key
3674215367 这三个数字已经排好序
对4进行操作
从后往前进行比较
4和7比,4小于73647215先不管
对6和4,6大于43467
对于4和3来说,3小于4,因此他俩不需要交换位置
3467215
下面对2进行操作
[3467]215
对于7和2来说,7大于23462715先不管他俩
下面6和2#include<stdio.h>#include<stdlib.h>voidinsert(int arr[],int n){int key = arr[n];int i = n;while(arr[i-1]>key){
arr[i]= arr[i-1];
i--;if(i==0){break;}}
arr[i]= key;}voidinsertionSort(int arr[],int n){int i;for(i=1;i<n;i++){insert(arr,i);}}intmain(int argc,char*argv[]){int arr[]={3,6,7,4,2,1,5};int i;insertionSort(arr,7);for(i=0;i<7;i++){printf("%d\n",arr[i]);}return0;}
definsert(arr,n):
key = arr[n]
i = n
while arr[i-1]>key:
arr[i]= arr[i-1]
i -=1if i==0:break
arr[i]= key
definsertionSort(arr,n):
i =1while i < n:
insert(arr,i)
i+=1
arr =[3,6,7,4,2,1,5]
insertionSort(arr,7)for element in arr:print(element,end="\t")