八种排序算法
https://www.cnblogs.com/yadiel-cc/p/11829360.html
https://www.cnblogs.com/chinaifae/p/10320814.html
冒泡排序
public void bubbleSort(int[] a){
int length=a.length;
int temp;
// 外层循环控制次数
for(int i=0;i<a.length;i++){
// 内存循环两两比较
for(int j=0;j<a.length-i-1;j++){
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
快排
思路:
在数组中找一个元素(节点),比它小的放在节点的左边,比它大的放在节点右边。一趟下来,比节点小的在左边,比节点大的在右边。
不断执行这个操作…
代码实现:
快速排序用递归比较好写【如果不太熟悉递归的同学可到:递归就这么简单】。支点取中间,使用L和R表示数组的最小和最大位置
不断进行比较,直到找到比支点小(大)的数,随后交换,不断减小范围~
递归L到支点前一个元素(j)(执行相同的操作,同上)
递归支点后一个元素(i)到R元素(执行相同的操作,同上)
/**
* 快速排序
*
* @param arr
* @param L 指向数组第一个元素
* @param R 指向数组最后一个元素
*/
public static void quickSort(int[] arr, int L, int R) {
int i = L;
int j = R;
//支点
int pivot = arr[(L + R) / 2];
//左右两端进行扫描,只要两端还没有交替,就一直扫描
while (i <= j) {
//寻找直到比支点大的数
while (pivot > arr[i])
i++;
//寻找直到比支点小的数
while (pivot < arr[j])
j--;
//此时已经分别找到了比支点小的数(右边)、比支点大的数(左边),它们进行交换
if (i <= j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
}
//上面一个while保证了第一趟排序支点的左边比支点小,支点的右边比支点大了。
//“左边”再做排序,直到左边剩下一个数(递归出口)
if (L < j)
quickSort(arr, L, j);
//“右边”再做排序,直到右边剩下一个数(递归出口)
if (i < R)
quickSort(arr, i, R);
}
插入排序
思路:
假设数列第一个元素为已排序数列,剩余数列为未排序将待排序元素挨个插入到已排序数列中每次插入都必须保证数列是有序的,即通过比较和移动有序数列中的元素,将元素插入到合适的位置
思路:如同玩扑克牌一样,每次摸牌都将它与手中的牌比较,始终将牌放在比它大的牌前面,比它小的牌后面。这样当牌全部摸到手上后,就是一个有序的序列。从后往前找合适的位置
public int[] insert(int[] array) {
for (int i = 1; i < array.length; i++) {
if (array[i] < array[i - 1]) {
//如果第i个数大于前一个数就不用判断了,因为前面都是有序数列,大于前一个数肯定比前面所有数都大,否则的话把这个数拿出来也就是赋值给temp,然后依次与前面的数比较,如果比前一个数小就让前一个数往后挪一位直到找到比temp小的位置放进去
int temp = array[i];
int f = i;
for (; f >= 1 && array[f - 1] > temp; f--) {
// 前面数需要后挪一位
array[f] = array[f-1];
}
array[f] = temp;
}
}
return array;
}
}
// 测试
public class MainActivity extends AppCompatActivity {
int[] arr = new int[]{9, 5, 4, 8, 7, 3, 1};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int[] insert = insert(arr);
System.out.println(Arrays.toString(insert));
}