常见排序算法代码整理
来源:互联网 发布:gamemaker 不需要编程 编辑:程序博客网 时间:2024/05/22 15:25
排序算法的稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。
1、交换排序
(1)冒泡排序:
- public void BubbleSort(int[] x)
- {
- for(int i=0;i<x.length-1;i++)
- {
- for(int j=0;j<x.length-i-1;j++)
- {
- if(x[j]>x[j+1])
- swap(x,j,j+1);
- }
- }
- }
- public void swap(int[] x,int i,int j)
- {
- int t=x[i];
- x[i]=x[j];
- x[j]=t;
- }
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:稳定
(2)快速排序:
- public void Quicksort(int[] x)
- {
- HelperOfQuicksort(x,0,x.length-1);
- }
- public void HelperOfQuicksort(int[] x,int low,int high)
- {
- if(low<high)
- {
- int mid=getMiddleIndex(x,low,high);
- HelperOfQuicksort(x,low,mid-1);
- HelperOfQuicksort(x,mid+1,high);
- }
- }
- public int getMiddleIndex(int[] x,int low,int high)
- {
- int tmp=x[low];
- while(low<high)
- {
- while(low<high&&x[high]>=tmp)
- high--;
- x[low]=x[high];
- while(low<high&&x[low]<=tmp)
- low++;
- x[high]=x[low];
- }
- x[low]=tmp;
- return low;
- }
时间复杂度:O(n^logn)
空间复杂度:O(n^logn)
稳定性:不稳定
2、插入排序
(1)直接插入排序:
- public void StraightInsertionSort(int[] x)
- {
- if(x.length==1)
- return ;
- for(int i=1;i<x.length;i++)
- {
- int cur=x[i];
- int m=i-1;
- for(;m>=0&&x[m]>cur;m--)
- x[m+1]=x[m];
- x[m+1]=cur;
- }
- }
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:稳定
(2)希尔排序:
- public void ShellSort(int[] x)
- {
- int gap=x.length/2;
- while(gap>=1)
- {
- for(int i=0;i<gap;i++)
- {
- for(int j=i+gap;j<x.length;j+=gap)
- {
- int cur=x[j];
- int index=j-gap;
- for(;index>=0&&x[index]>cur;index-=gap)
- x[index+gap]=x[index];
- x[index+gap]=cur;
- }
- }
- gap/=2;
- }
- }
时间复杂度:O(n^1.25)到O((1.6n)^1.25)(经验公式)
空间复杂度:O(1)
稳定性:不稳定
3、选择排序
(1)简单选择排序:
- public void SimpleSelectionSort(int[] x)
- {
- for(int i=0;i<=x.length-2;i++)
- {
- int curMin=Integer.MAX_VALUE;
- int index=-1;
- for(int j=i;j<x.length;j++)
- {
- if(x[j]<curMin)
- {
- index=j;
- curMin=x[j];
- }
- }
- swap(x,i,index);
- }
- }
- public void swap(int[] x,int i,int j)
- {
- int t=x[i];
- x[i]=x[j];
- x[j]=t;
- }
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:不稳定([2,2,1],循环首次执行之后1与首元素,即第一个2交换,变成[1,2,2]。第一个二跑到了最后,在原来第二个2之后)
(2)堆排序
- public void Heapsort(int[] x)
- {
-
- for(int i=x.length-1;i>=1;i--)
- {
- BuildHeap(x,i);
- swap(x,0,i);
- }
- }
- public void BuildHeap(int[] x,int LastIndex)
- {
- int k=-1;
-
- for(int i=LastIndex;i>=1;i--)
- {
- int curParentNode=(i-1)/2;
-
- if(curParentNode==k)
- continue;
- k=curParentNode;
- int biggerSonNode=-1;
- if(k*2+2<=LastIndex)
- biggerSonNode=x[k*2+1]>=x[k*2+2]?(k*2+1):(k*2+2);
- else
- biggerSonNode=k*2+1;
- if(x[biggerSonNode]>x[k])
- swap(x,biggerSonNode,k);
- }
- }
- public void swap(int[] x,int i,int j)
- {
- int t=x[i];
- x[i]=x[j];
- x[j]=t;
- }
时间复杂度:O(n*logn)
空间复杂度:O(1)
稳定性:不稳定
4、归并排序
- public void MergeSort(int[] x)
- {
- HelperSort(x,0,x.length-1);
- }
- public void HelperSort(int[] x,int start,int end)
- {
- if(start>=end)
- return;
- int mid=(start+end)/2;
- int start1=start;
- int end1=mid;
- int start2=mid+1;
- int end2=end;
- HelperSort(x,start1,end1);
- HelperSort(x,start2,end2);
- merge(x,start1,end1,start2,end2);
- }
- public void merge(int[] x,int FirStart,int FirEnd,int SecStart,int SecEnd)
- {
- int[] temp=new int[SecEnd-FirStart+1];
- int tempIndex=0;
- int first=FirStart;
- int second=SecStart;
- while(first<=FirEnd&&second<=SecEnd)
- {
- if(x[first]<=x[second])
- {
- temp[tempIndex]=x[first];
- tempIndex++;
- first++;
- }
- else
- {
- temp[tempIndex]=x[second];
- tempIndex++;
- second++;
- }
- }
- while(first<=FirEnd)
- temp[tempIndex++]=x[first++];
- while(second<=SecEnd)
- temp[tempIndex++]=x[second++];
- for(int i=0;i<tempIndex;i++)
- x[FirStart+i]=temp[i];
-
- }
时间复杂度:O(n*logn)
空间复杂度:O(n)
稳定性:稳定
5、基数排序
- public void RadixSort(int[] x)
- {
- int max=Integer.MIN_VALUE;
- for(int i=0;i<x.length;i++)
- {
- if(x[i]>max)
- max=x[i];
- }
- int maxbit=0;
- while(max>0)
- {
- max/=10;
- maxbit++;
- }
- int radix=10;
- ArrayList<Queue> list=new ArrayList<>();
- for(int i=0;i<radix;i++)
- {
- Queue<Integer> q=new LinkedList<>();
- list.add(q);
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- int dividend=1;
- for(int i=0;i<maxbit;i++)
- {
- for(int j1=0;j1<x.length;j1++)
- {
- int index=(x[j1]/dividend)%radix;
- list.get(index).offer(x[j1]);
- }
- dividend*=10;
- int m=0;
- for(int j2=0;j2<radix;j2++)
- {
- while(list.get(j2).size()!=0)
- {
- x[m]=(int) list.get(j2).poll();
- m++;
- }
- }
- }
- }
时间复杂度:O(d*n) d为长度(对应代码中maxbit),n为数组长度
空间复杂度:O(n)
稳定性:稳定
0 0