vlambda博客
学习文章列表

java中几种常用排序算法实现

一、冒泡排序

冒泡排序:就是每次两两比较,将大值(小值)放后面,遍历一次后,最后一个是肯定是最大的(最小的),然后去除最后一个值,将剩下的按照相同的方法继续遍历,知道只剩下一个值。

8--5比较 8 5 3 2 7
8--3比较 5 8 3 2 7
8--2比较 5 3 8 2 7
8--7比较 5 3 2 8 7
5--3比较 5 3 2 7 8
5--2比较 3 5 2 7 8
5--7比较 3 2 5 7 8
3--2比较 3 2 5 7 8
3--5比较 2 3 5 7 8
2--3比较 2 3 5 7 8
结果 2 3 5 7 8
public static void main(String[] args) {
int arr[] = {8,5,3,2,7};
for(int i =0; i < arr.length ; i++){
for(int j = 0 ; j < arr.length - i -1 ; j++){
if(arr[j] > arr[j + 1]){
int temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
for(int k = 0 ; k < arr.length ; k++){
System.out.println(arr[k]);
}
}

二、选择排序

选择排序:把第一个数值假设为最小的数,然后遍历比较找出真实最小的数,记录这个数的下标,然后将假设的最小的数与真实最小的数交换位置。

再按照相同的方法比较后面的值。

public static void main(String[] args) {
int arr[] = {8,5,3,2,7};
for (int i = 0; i < arr.length; i++) {
int min = arr[i];
int index = i;
for (int j = i + 1; j < arr.length; j++) {
if(min > arr[j]){
min = arr[j];
index = j;
}
}
int temp = arr[i];
arr[i] = min;
arr[index] = temp;
}
for(int k = 0 ; k < arr.length ; k++){
System.out.println(arr[k]);
}
}

三、插入排序

插入排序顾名思义,就是要把数字插进去比较大小,也就是将一个数值和有顺序的数列中的值比较,得到一个新的有序数列比较的时候,如果要插入的数值小于比较的值,那就继续和有序数列前面的值比较,知道插入的数值大于比较的值,大于后,还没有比较的值也就不用继续比较了,因为本来就是有序的数列。

public static void main(String[] args) {
int arr[] = {8,5,3,2,7};

for (int i = 1; i < arr.length ; i++) {
for (int j = i; j > 0; j--) {
if(arr[j] < arr[j - 1]){
int temp = arr[j];
arr[j] = arr[j -1];
arr[j -1] = temp;
}
else {
break;
}
}
}

for(int k = 0 ; k < arr.length ; k++){
System.out.println(arr[k]);
}
}

四、希尔排序

希尔排序其实就是对插入排序的改进,也就是分组的插入排序,就是将待排序的序列分为了分成小组,小组内的数据都是在原序列的基础上根据步长增量设置的,然后对这个小组进行排序,然后缩小不畅增量继续进行上述操作,知道步长增量为1,这时候数据顺序只需要在进行一下小调整就完成了。

public static void main(String[] args) {
int arr[] = {8,5,3,2,7,4,1,12,14,11,65,34};

for(int i = arr.length /2 ; i > 0 ;i /=2){
for (int j = i; j < arr.length; j++) {
//j控制无序端的起始位置
for (int k = j; k > 0 && k - i >= 0; k -= i) {
if (arr[k] < arr[k - i]) {
int temp = arr[k - i];
arr[k - i] = arr[k];
arr[k] = temp;
} else {
break;
}
}
}
}

for(int k = 0 ; k < arr.length ; k++){
System.out.println(arr[k]);
}
}

五、快速排序

快速排序就是:设置第一个值为中间值,小于这个值的放在这个值的左边,大于的放在右边,完成后

然后将第一步分好的左右两边分别再进行比较

一直到不能比较为止。

   public static void main(String[] args) {
int arr[] = {8,5,3,2,7,4,1,12,14,11,65,34};

int low = 0;
int hight = arr.length - 1;
quickSort(arr,low,hight);
for(int k = 0 ; k < arr.length ; k++){
System.out.println(arr[k]);
}
}

private static void quickSort(int[] arr, int low, int hight) {
//如果两个指针在位置相同,也就是只有一个元素,直接退出。
if(hight - low < 1){
return;
}
boolean flag = true; //low<hight就为true,

int start = low;
int end = hight;

//中间值为 低指针的第一个值
int midValue = arr[low];

while (true){
if(flag){
if(arr[hight] > midValue){
hight--;
}else if(arr[hight] < midValue){
arr[low] = arr[hight];
low ++;
flag = false;
}
}else {
if(arr[low] < midValue){
low ++;
}else if(arr[low] > midValue){
arr[hight] = arr[low];
hight --;
flag = true;
}
}
if(low == hight){
arr[low] = midValue;
break;
}
}
quickSort(arr, start, low -1);
quickSort(arr, low + 1, end);


}

六、归并排序

归并排序:选择相邻两个数组成一个有序序列。

选择相邻的两个有序序列组成一个新的有序序列。

一直重复上一步,直到全部组成一个有序序列。

public static void main(String[] args) {
int arr[] = {8,5,3,2,7,4,1,12,14,11,65,34};

int start = 0;
int end = arr.length - 1;
mergeSort(arr,start,end);
for(int k = 0 ; k < arr.length ; k++){
System.out.println(arr[k]);
}
}

private static void mergeSort(int[] arr, int start, int end) {
if(end - start > 0){
mergeSort(arr, start, (start + end) / 2);
mergeSort(arr, (start + end) / 2 + 1, end);

int left = start;
int right = (start + end) / 2 + 1;

//每个小单位的排序结果
int index = 0;

int[] result = new int[end - start + 1];

while (left <= (start + end) / 2 && right <= end){
if(arr[left] <= arr[right]){
result[index] = arr[left];
left ++;
}else {
result[index] = arr[right];
right ++;
}
//移动小单位记录的下标
index ++;
}

while (left <= (start + end) / 2 || right <= end){
if(left <= (start + end) / 2){
result[index] = arr[left];
left++;
}else {
result[index] = arr[right];
right ++;
}
index ++;
}

for (int i = start; i <= end ; i++) {
arr[i] = result[i - start];
}

}
}