本人小白一名,描述的可能不是很好。有哪些错误的地方望指正
1.冒泡排序:就是相邻的两个元素进行比较,例如从小到大的排序,大的数放右边,小的放左边,最终会把最大的放在结尾
arr={22,6,88,20}
第一次比较
若果arr[0]>arr[1]就交换位置,即大的数放右边
第二次比较
arr[1]跟arr[2]比较,发现arr[a]<arr[2]则说明大的数已经在右边,则不需要调换位置
第三次比较
arr[2]跟arr[3]比较,arr[2]>arr[3]就交换位置,即大的数放右边
最终最大的数会被冒到最后
public void sort(int arr[]) { if(arr!=null){//1.判断数组是否为空,不为空时才运行 for (int i = 0; i < arr.length-1; i++) {//至少要循环arr.length-1次 for (int j = 0; j < arr.length-1-i; j++) {//每进行一次循环比较就会帅选出最大那个,所以无需对已经比较过的在进行比较,即每次循环会减少一次比较arr.length-1-i if(arr[j]>arr[j+1]){//当前元素比它后面个元素大时则交换位置 int temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } } }
2.选择排序(直接排序): 使用数组中的一个元素(被比较元素)与其他位置的元素挨个比较一次,符合条件交换位置。或记录下符合条件的索引index,最后将被比较元素的index和符合条件的index进行元素交换。
public void choiceSort(int arr[]){//第一种方法,这种方法每次都会进行元素的交换 if(arr!=null){ for (int i = 0; i < arr.length-1; i++) { for (int j = i+1; j < arr.length; j++) { if(arr[i]>arr[j]){ int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } } } } } public void choiceSort2(int arr[]){//第二种方法,每次比较完后会记录最后符合条件的索引然后进行交换 if(arr!=null){ int k;//符合条件的索引 int temp; for (int i = 0; i < arr.length-1; i++) { k=i;//记录被比较元素的索引 for (int j = i+1; j < arr.length; j++) { if(arr[k]>arr[j]){//判断条件被比较元素是否大于当前j的元素 k=j;//记录符合条件的索引 } } //交换元素 temp=arr[i]; arr[i]=arr[k]; arr[k]=temp; } } }
3.插入排序:即从索引1(目标元素)开始根前面的所有元素进行比较,符合条件的元素进行后移,在将目标元素放到被移动元素的前面。
public void insertionSort(int arr[]) { if(arr!=null){ int temp;//目标元素 for (int i = 1; i < arr.length; i++) {//从1开始遍历 temp=arr[i];//记录目标元素 int j=i-1;//记录目标元素的前一个索引 while(j>=0 && arr[j]>temp){//判断目标元素之前的元素有没有大于目标元素的 arr[j+1]=arr[j];//将大于目标元素的元素后移 j--; } if(j!=i-1){//判断之前有没有大于目标元素的,有则替换 arr[j+1]=temp; } } } }