备战校招——常见排序

算法简单,但要想写出稳定健壮性好的排序程序还是很有挑战的,尤其是对边界的控制。

直接上干货吧,Resource Code.....:

  1 public class Sort {
  2
  3     public static void main(String [] argv){
  4
  5
  6         int [] source0 = {5,3,7,9,1,2,6,4,8};
  7         int [] source1 = {5,3,7,9,1,2,6,4,8};
  8         int [] source2 = {5,3,7,9,1,2,6,4,8};
  9         int [] source3 = {5,3,7,9,1,2,6,4,8};
 10         //*  快排测试   *//
 11         Sort test = new Sort();
 12         test.Quick_sort(source0,0,source0.length-1);
 13         System.out.println("Quick sort result:");
 14         for (int k:source0){
 15             System.out.print(" "+k);
 16         }
 17         System.out.println();
 18
 19         //*  冒泡测试   *//
 20         test.Bubble_sort(source1);
 21         System.out.println("Bubble sort result:");
 22         for (int k:source1){
 23             System.out.print(" "+k);
 24         }
 25         System.out.println();
 26
 27         //*  归并测试   *//
 28         test.Merge_sort(source2, 0, source2.length-1);
 29         System.out.println("Merge sort result:");
 30         for (int k:source2){
 31             System.out.print(" "+k);
 32         }
 33         System.out.println();
 34
 35         //*  堆排测试   *//
 36         test.Heap_sort(source3);
 37         System.out.println("Heap sort result:");
 38         for (int k:source3){
 39             System.out.print(" "+k);
 40         }
 41     }
 42
 43     //*  堆排序   *//
 44     public void Heap_sort(int[] arr){
 45         int [] Result = new int[arr.length];
 46
 47         for(int i=0; i<arr.length; i++){
 48             Heap_up(Result,i, arr[i]);
 49         }
 50         //System.out.println("............");
 51         for (int i=arr.length; i>=1; i--){
 52             //System.out.print(" "+Result[0]);
 53             Heap_down(Result,i);
 54         }
 55         for(int i=0; i<arr.length; i++){
 56             arr[i]=Result[arr.length-1-i];
 57             //System.out.println(Result[i]);
 58         }
 59     }
 60
 61     public void Heap_up(int[] arr,int n, int n_Num){
 62
 63         arr[n]=n_Num;
 64         Heap_up_adjust(arr,n);
 65
 66     }
 67
 68     public void Heap_up_adjust(int[] arr,int i){
 69
 70         int j,temp;
 71         j=(i-1)/2;
 72         temp = arr[i];
 73         while(j>=0&&i!=0){
 74
 75             if(arr[j]<=temp)
 76                 break;
 77             arr[i]=arr[j];
 78             i=j;
 79             j=(i-1)/2;
 80         }
 81         arr[i]=temp;
 82     }
 83
 84     public void Heap_down(int[] arr,int n){
 85
 86         int tmp = arr[0];
 87         arr[0]=arr[n-1];
 88         arr[n-1]=tmp;
 89         Heap_down_adjust(arr, n);
 90     }
 91
 92     public void Heap_down_adjust(int[] arr, int n){
 93
 94         int i=0;
 95         int j = 2*i+1;
 96         int tmp=arr[0];
 97         while(j<n-1){
 98             if (j + 1 < n-1 && arr[j + 1] < arr[j])
 99                 j++;
100             if(arr[j]>=tmp)
101                 break;
102             arr[i]=arr[j];
103             i=j;
104             j=2*i+1;
105         }
106         arr[i]=tmp;
107     }
108
109     //*  归并排序 *//
110     public void Merge_sort(int[] arr, int x, int y){
111         int mid = (x+y+1)/2;
112         //System.out.println(mid);
113         if(mid-1>x) Merge_sort(arr,x,mid-1);
114         if(y>mid) Merge_sort(arr,mid,y);
115         merge(arr,x,mid,y);
116     }
117     public void merge(int[] arr, int s, int m, int t){
118         int[] tmp = new int[t-s+1];
119         int i = 0;
120         int j = s;
121         int k = m;
122         while(!(j==m&&k==t+1)){
123             while(j<m){
124                 if(k==t+1){
125                     tmp[i]=arr[j];
126                     //System.out.println(tmp[i]+" "+arr[j]);
127                     //System.out.println("temp "+i+" "+tmp[i]+" "+j+" "+arr[j]);
128                     i++;
129                     j++;
130
131                 }
132                 else{
133                     if(arr[j]<=arr[k]){
134                     tmp[i]=arr[j];
135                     //System.out.println(tmp[i]+" "+arr[j]);
136                     //System.out.println("temp "+i+" "+tmp[i]+" "+j+" "+arr[j]);
137                     i++;
138                     j++;
139                     }
140                     else
141                         break;
142                 }
143
144             }
145             while(k<=t){
146                 if(j==m){
147                     tmp[i]=arr[k];
148                     //System.out.println(tmp[i]+" "+arr[k]);
149                     //System.out.println("temp "+i+" "+tmp[i]+" "+k+" "+arr[k]);
150                     i++;
151                     k++;
152                 }
153                 else{
154                     if(arr[k]<=arr[j]){
155
156                     tmp[i]=arr[k];
157                     //System.out.println(tmp[i]+" "+arr[j]);
158                     //System.out.println("temp "+i+" "+tmp[i]+" "+k+" "+arr[k]);
159                     i++;
160                     k++;
161                     }
162                     else
163                         break;
164                 }
165
166             }
167         }
168         for(int p=s; p<=t; p++){
169             arr[p]=tmp[p-s];
170             //System.out.print(" "+arr[p]);
171         }
172     }
173
174     //* 冒泡排序 *//
175     public void Bubble_sort(int[] arr){
176
177         for(int i=0; i<arr.length-1;i++){
178             for(int j=0; j<arr.length-1-i;j++){
179                 //System.out.println("i: "+i+"  j: "+j);
180                 if(arr[j]>arr[j+1]){
181                     int temp =arr[j];
182                     arr[j]=arr[j+1];
183                     arr[j+1]=temp;
184                 }
185             }
186
187         }
188
189     }
190
191     //* 快速排序 *//
192     public void Quick_sort(int[] arr, int low, int high)
193     {
194     int l=low;
195     int h=high;
196     int povit=arr[low];
197
198      while(l<h)
199      {
200      while(l<h&&arr[h]>=povit)
201      h--;
202      if(l<h){
203      int temp=arr[h];
204      arr[h]=arr[l];
205      arr[l]=temp;
206      l++;
207      }
208
209      while(l<h&&arr[l]<=povit)
210      l++;
211
212      if(l<h){
213      int temp=arr[h];
214      arr[h]=arr[l];
215      arr[l]=temp;
216      h--;
217      }
218      }
219     // System.out.print(arr);
220     // System.out.print("l="+(l+1)+"h="+(h+1)+"povit="+povit+"\n");
221      if(l>low) Quick_sort(arr,low,l-1);
222      if(h<high) Quick_sort(arr,l+1,high);
223      }
224
225
226 }
时间: 2024-11-01 16:23:29

备战校招——常见排序的相关文章

【整理】常见排序算法及其时间复杂度总结

原文出处: 1. 白话经典算法系列之八 MoreWindows白话经典算法之七大排序总结篇 2. 面试常用算法总结--排序算法(java版) 3. 常见排序算法小结 本篇主要整理了冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序,堆排序七种常见算法,是从上面三篇博文中摘抄整理的,非原创. 一.冒泡排序 主要思路是: 通过交换相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就"沉"到最后面了.重复N次即可以使数组有序. 冒泡排序改进1: 在某次遍历中,如果没有

常见排序算法(一) MergeSort

算法思想灰常重要,常见的用到分治思想的算法包括快速排序,归并,二分搜搜,大整数乘法等(参考 http://blog.csdn.net/com_stu_zhang/article/details/7233761,归纳很到位) 简单用归并对一个数组排序 思路: 简单来说对一个数组,只要他的左右两部分都是有序的,那么简单合并就ok了,那么左右两部分可以进一步划分各自的左右两部分----明显就是要递归了 算法:归并排序 1. 将数组一分为二,subArray1 和subArray2 2. 归并排序sub

常见排序算法(java实现)

常见排序算法介绍 冒泡排序 代码: public class BubbleSort { public static void sort(int[] array) { int tValue; for (int i = 0; i < array.length; i++) { for (int j = i; j < array.length; j++) { if (array[i] > array[j]) { tValue = array[i]; array[i] = array[j]; ar

常见排序算法(冒泡、选择、插入、快速、归并C++实现)

常见排序算法(冒泡.选择.插入.快速.归并C++实现) #include <iostream> using namespace std; // 冒泡排序 void bubbleSort (int data[], size_t size) { for (size_t i = 0; i < size - 1; ++i) { bool ordered = true; for (size_t j = 0; j < size - 1 - i; ++j) if (data[j+1] <

几种常见排序算法

几种常见排序算法 几种常见排序算法 写在前面 基础介绍 初级排序算法 selection sort选择排序 insertion sort插入排序 ShellSort希尔排序 shuffing不是排序算法 merge sort归并排序 Abstract in-place merge原地归并的抽象方法 Top-down mergesort自顶向下的归并排序 Bottom-up mergesort自底向上的归并排序 quicksort 三向切分的快速排序 Heapsort堆排序 总结和比较 命题 本文

第六章 常见排序算法

上章回顾 二叉树的定义 树深度的定义 什么样的二叉树是满二叉树 中序遍历的规则 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git 第六章 第六章 常见排序算法 常见排序算法 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorith

常见排序算法总结(java实现)

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.常见的排序算法有选择排序,插入排序,希尔排序,归并排序和快速排序 由于在排序的过程中不可避免的要涉及到比较和交换,所以将他们抽取为两个单独的函数,如下所示 //为了排序代码的通用性,这里假定待排序的元素实现了Comparable接口 private static boolean less(Comparable v ,Comparable w){ return v.compareTo(w)<0; } priva

十种常见排序算法

1.常见算法分类 十种常见排序算法一般分为以下几种: (1)非线性时间比较类排序:交换类排序(快速排序和冒泡排序).插入类排序(简单插入排序和希尔排序).选择类排序(简单选择排序和堆排序).归并排序(二路归并排序和多路归并排序): (2)线性时间非比较类排序:计数排序.基数排序和桶排序. 总结: (1)在比较类排序中,归并排序号称最快,其次是快速排序和堆排序,两者不相伯仲,但是有一点需要注意,数据初始排序状态对堆排序不会产生太大的影响,而快速排序却恰恰相反. (2)线性时间非比较类排序一般要优于

常见排序算法(PHP实现)

function InsertSort($arr){ $num = count($arr); for($i = 1; $i < $num; $i++){ $key = $arr[$i]; for($j = $i - 1; $j >= 0; $j--){ if($arr[$j] > $key){ $arr[$j + 1] = $arr[$j]; $arr[$j] = $key; } } } return $arr; } function BubbleSort($arr){ $num = c