简单排序
一、冒泡排序。
A.排序原理。
1.比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置。
2.对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素。最终最后的位置的元素就是最大值。
B.实现方式。
int[] a = {1,25,2,60,30};
for (int i = a.length-1; i>0 ; i--) {
for (int j = 0; j < i; j++) {
//比较索引j和索引j+1处的值。
if (a[j]>a[j+1]){
int t;
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for (int i = 0; i <a.length ; i++) {
System.out.print(a[i]+" ");
}
C.时间复杂度分析。
时间复杂度为O(N^2)。
D.实现过程。
二、选择排序。
A.排序原理。
1.每一次遍历的过程中,都假定第一个索引处的元素是最小值,和其他索引处的值依次进行比较,如果当前索引处的值大于其他某个索引处的值,则假定其他某个索引处的值为最小值,最后可以找到最小值所在的索引。
2.交换第一个索引处和最小值所在的索引处的值。
B.实现方式。
public class demo14 {
public static void main(String[] args) {
int[] a = {3,1,5,7,2,4,9,6};
for (int i = 0; i <a.length-1 ; i++) {
//定义一个变量,记录最小元素所在的索引,默认为参与选择排序的第一个元素所在位置。
int minIndex = i,t;
for (int j = i + 1; j < a.length; j++) {
//需要比较最小索引minIndex处的值和j索引处的值。
if (a[minIndex] > a[j]) {
minIndex = j;
}
}
if (minIndex!=i) {
t = a[i];
a[i] = a[minIndex];
a[minIndex] = t;
}
}
for (int i = 0; i <a.length ; i++) {
System.out.print(a[i]+" ");
}
}
}
C.时间复杂度分析。
D.实现过程。
时间复杂度为O(N^2)。
三、插入排序。
插入排序是一种简单直观且稳定的排序算法。
A.排序原理。
1.把所有的元素分为两组,已经排序的和未排序的;
2.找到未排序的组中的第一个元素,向已经排序的组中进行插入。
3.倒叙遍历已经排序的元素,依次和待插入的元素进行比较,直到找到一个元素小于等于待插入元素放到这个位置,其他的元素向后移动一位。
B.实现方式。
int[] a = {1,25,2,60,30};
int t=0;//定义一个中间变量。
for (int i = 1; i <a.length ; i++) {
for (int j = i; j >=0 ; j--) {
//比较索引j处的值和索引j-1处的值,如果索引j-1处的值比索引j处的值大,则交换数据,
// 如果不大,那么找到合适的位置交换即可。
if (a[j-1]>a[j]){
t = a[j-1];
a[j-1] = a[j];
a[j] = t;}
else break;
}
时间复杂度为O(N^2)。
复杂排序。
四、希尔排序。
希尔排序就很好的解决了插入排序在遇到数据多且极其不规律情况下的效率问题,大家首先想想我们如果要去解决插入排序遇到的这个数据多且不规律的问题 ,首先想到的办法是什么 ,当然是把大的数据放到前面 小的数据放到后面去,完毕后再用插入排序把这组相对有序的数据进行排序 就很好解决了不规律而导致的效率问题。
这里是引用
A.排序原理。
1.选定一个增长量h,按照增长量h作为数据分组的依据,对数据进行分组。
2.对分好的每一组数据完成插入排序。
3.减小增长量,最小减为1,重复第二步操作。
B.实现方式。
import java.util.Arrays;
public class demo15 {
public static void main(String[] args) {
int[] arr = {1,7,202,3,5,4,6,0};
shellSort(arr);
}
public static void shellSort(int[] arr){
// 步长gap 并逐步的缩小步长
for (int gap = arr.length/2 ; gap > 0 ; gap /= 2){
// 从第gap个元素 逐步对其所在组进行
//直接插入如排序
for (int i = gap ; i < arr.length ; i++){
int j = i;
int temp = arr[j];
if (arr[j] < arr[j - gap]){
while (j - gap >= 0 && temp < arr[j - gap]){
arr[j] = arr[j-gap];
j = j - gap;
}
// 当退出while后 就给temp
//找到插入的位置
arr[j] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
五、快速排序
A.排序原理。
B.实现方式。
public class demo16 {
public static void main(String[] args) {
int[] a = {4,-1,20,3,1,0};
qiuckSort(a,0,a.length-1);
for (int i = 0; i <a.length ; i++) {
System.out.print(a[i]+" ");
}
}
public static void qiuckSort(int[] arr,int left,int rigth){
//进行判断
if (left>rigth) {
return;
}
//定义变量 base是基准数,i指向最左边,j指向最右边。
int base=arr[left], i = left ,j = rigth;
//当i和j不相遇的时候,在循环中进行检索。
while(i != j){
//由j从右往左检索比基准数小的,如果检索到比基准数小的就停下。
//如果检索比基准数大的或者相等的,就继续检索。
while(arr[j]>=base && i<j){
j--; //j从右往左移动。
}
while(arr[i]<=base && i<j){
i++; //i从左往右移动。
}
//代码走到这里。i停下了,j也停下了。然后交换i和j位置的元素。
int temp = arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
//把相遇位置的元素父之过基准数这个位置的元素
arr[left]=arr[i];
//把基准数赋值给相遇位置的元素。
arr[i]=base;
qiuckSort(arr,left,i-1);
qiuckSort(arr,j+1,rigth);
}
}