您的位置:首页 > 编程语言 > Java开发

排序算法java代码 冒泡排序、快速排序、插入排序、希尔排序、选择排序、堆排序、归并排序

2020-03-06 20:00 471 查看

时间复杂度:O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(nk)<O(2n)

8大排序算法:
1.冒泡排序 (交换排序) O(n2)
2.快速排序 (交换排序) O(n2)
3.直接插入排序(插入排序) O(n2)
4.希尔排序 (插入排序)
5.简单选择排序(选择排序) O(n2)
6.堆排序 (选择排序)O(nlogn)
7.归并排序 O(nlogn)
8.基数排序

1.冒泡排序

思路:两两比较,找到最大的,再找到次大的……
【例子】:{5,7,2,9,4,1,0,5,7}
5,2,7,4,1,0,5,7,9
2,5,4,1,0,5,7,7,9
2,4,1,0,5,5,7,7,9
2,1,0,4,5,5,7,7,9
1,0,2,4,5,5,7,7,9
0,1,2,4,5,5,7,7,9
0,1,2,4,5,5,7,7,9
0,1,2,4,5,5,7,7,9

public void bubbleSort(int[]arr){
//循环arr.length-1次
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-i-1;j++){
//两两交换,大的放到后面
if(arr[j+1]<arr[j]){
int tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
}

2.快速排序

思路:把数组第一个作为标准,大的放在标准的左边,小的放在标准的右边
【例子】:{5,7,2,9,4,1,0,5,7}
第一次排序后:{2,1,3}{8,9,5,7,5,6}

public void quickSort(int[]arr,int start,int end){
if(start>=end) return;
//选取标准
int stard=arr[start];
int low=start;
int high=end;

while(low<high){
//大的话就左移
while(low<high&&stard<=arr[high]) high--;
arr[low]=arr[high];
//小的话就右移
while(low<high&&arr[low]<=stard) low++;
arr[high]=arr[low];
}
arr[high]=stard;
quickSort(arr, start, low);
quickSort(arr, high+1, end);
}

3.插入排序

思路:认为前面都是有序的,一个个往前插入
【例子】:{5,7,2,9,4,1,0,5,7}
{5,7,2,9,4,1,0,5,7}
{2,5,7,9,4,1,0,5,7}
{2,5,7,9,4,1,0,5,7}
{2,4,5,7,9,1,0,5,7}
{1,2,4,5,7,9,0,5,7}
{0,1,2,4,5,7,9,5,7}
{0,1,2,4,5,5,7,9,7}
{0,1,2,4,5,5,7,7,9}

public void insertSort(int[]arr){
for(int i=1;i<arr.length;i++){
if(arr[i]<arr[i-1]){
int tmp=arr[i];
//找到前面合适的位置,插入
int j;
for(j=i-1;j>=0&&tmp<arr[j];j--){
arr[j+1]=arr[j];//往后挪
}
arr[j+1]=tmp;
}
}
}

4.希尔排序

思路:分组插入排序
【例子】:{5,7,2,9,4,1,0,5,7}
d=4 {4,7,2,9,5,1,0,5,7}
d=4 {4,1,2,9,5,7,0,5,7}
d=4 {4,1,0,9,5,7,2,5,7}
d=4 {4,1,0,5,5,7,2,9,7}
d=4 {4,1,0,5,5,7,2,9,7}
d=2 {0,1,4,5,5,7,2,9,7}
d=2 {0,1,4,5,5,7,2,9,7}
d=2 {0,1,4,5,5,7,2,9,7}
d=2 {0,1,4,5,5,7,2,9,7}
d=2 {0,1,2,5,4,7,5,9,7}
d=2 {0,1,2,5,4,7,5,9,7}
d=2 {0,1,2,5,4,7,5,9,7}
d=1 {0,1,2,5,4,7,5,9,7}

public void sheelSort(int[]arr){
//遍历所有步长
for(int d=arr.length/2;d>0;d=d/2){
//遍历所有元素
for(int i=d;i<arr.length;i++){
//插入排序
for(int j=i-d;j>=0;j=j-d){
//交换
if(arr[j+d]<arr[j]){
int tmp=arr[j];
arr[j]=arr[j+d];
arr[j+d]=tmp;
}
}
}
}
}

5.选择排序

思路:当前遍历数和后面所有的数比较,记录最小的下标,交换
【例子】:{5,7,2,9,4,1,0,5,7}
{0,7,2,9,4,1,5,5,7}
{0,1,2,9,4,7,5,5,7}
{0,1,2,9,4,7,5,5,7}
{0,1,2,4,9,7,5,5,7}
{0,1,2,4,5,7,9,5,7}
{0,1,2,4,5,5,9,7,7}
{0,1,2,4,5,5,7,9,7}
{0,1,2,4,5,5,7,7,9}
{0,1,2,4,5,5,7,7,9}

public void selectSort(int[]arr){
for (int i = 0; i < arr.length; i++) {
int minIndex=i;
for (int j = i+1; j < arr.length; j++) {
if(arr[j]<arr[minIndex]){
minIndex=j;
}
}
//交换
if(i!=minIndex) {
int tmp=arr[i];
arr[i]=arr[minIndex];
arr[minIndex]=tmp;
}
}
}

6.堆排序

思路:二叉树
基础知识:
最大堆:越上层,数越大。root数最大
最小堆:越上层,数越小。root数最小
升序排列:最大堆
降序排列:最小堆

顺序存储的二叉树(考虑完全二叉树):用数组存
第n个元素的左子节点:2n+1
第n个元素的右子节点:2n+2
第n个元素的父节点:(n-1)/2

public void heapSort(int[] arr) {
//开始位置是最后一个非叶子节点,最后一个节点的父节点
//调整整个结构为最大堆/大顶堆
for (int i = (arr.length-1)/2; 0<=i; i--) {
maxHeap(arr, arr.length, i);
}
//最大的放到后面,第0和第n换位置,再调整成大顶堆
for(int i=arr.length-1;0<i;i--){
int tmp=arr[0];
arr[0]=arr[i];
arr[i]=tmp;
maxHeap(arr, i, 0);
}
}
public void maxHeap(int[] arr,int size,int index){
//左右节点
int leftNode=2*index+1;
int rightNode=2*index+2;
int max=index;
//找出最大的节点
if(leftNode<size&&arr[max]<arr[leftNode]) max=leftNode;
if(rightNode<size&&arr[max]<arr[rightNode]) max=rightNode;
//交换位置
if(max!=index){
int tmp=arr[max];
arr[max]=arr[index];
arr[index]=tmp;
//交换后可能会破坏之前排好的堆,重新调整
maxHeap(arr, size, max);
}

}

7.归并排序

思路:二路归并,先拆分成一个个的元素,再合并排序

public void mergeSort(int[]arr,int start,int end){
if(end<start) return ;
int mid=(start+end)/2;
mergeSort(arr, start, mid);
mergeSort(arr, mid+1, end);
merge(arr, start,mid, end);
}
private void merge(int[] arr, int start, int mid, int end) {
//合并两个排好序的数组
//临时数组,存放排好序的最终结果
int[]tmp =new int[end-start+1];
int i=start;
int j=mid+1;
//tmp的指针
int index=0;
while(i<=start&&j<=end){
//谁小谁放入tmp里
if(arr[i]<=arr[j]){
//放入tmp里
tmp[index]=arr[i];
index++;
i++;
}else{
tmp[index]=arr[j];
index++;
j++;
}
}
//剩余的也放入tmp
while(i<=mid)	tmp[index++]=arr[i++];
while(j<=end)   tmp[index++]=arr[j++];
//tmp放入arr
for(i=start;i<=end;i++){
arr[i]=tmp[i-start];
}
}

8.基数排序

思路:假设有10个桶,每次按照个位、十位、百位 数字放入到十个桶中。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
y159_4 发布了3 篇原创文章 · 获赞 0 · 访问量 22 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐