冒泡排序
实现思想:
⒈ 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
⒉ 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
⒊针对所有的元素重复以上的步骤,除了最后一个。
⒋持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
代码如下:
public static void bubble(int[] random){
for(int i = 0;i<random.length;i++){
for(int j = 0;j<random.length-i-1;j++){
if(random[j]>random[j+1]){
int t = random[j];
random[j] = random[j+1];
random[j+1] = t;
}
}
}
}
选择排序
实现思想:
对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面“后一个元素”现变成了“前一个元素”,继续跟他的“后一个元素”进行比较如果后面的元素比他要小则用变量k记住它在数组中的位置(下标),等到循环结束的时候,我们应该找到了最小的那个数的下标了,然后进行判断,如果这个元素的下标不是第一个元素的下标,就让第一个元素跟他交换一下值,这样就找到整个数组中最小的数了。然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推。
代码如下:
public static void selectSort(int random[]){
int min = 0,index = 0 ;
for(int i = 0;i<random.length;i++){
min = random[i];
index = i;
for(int j = i;j<random.length;j++){
if(random[j]<min){
min = random[j];
index = j;
}
}
int t = random[i];
random[i] = min;
random[index] = t;
}
}
插入排序
实现思想:
⒈ 从第一个元素开始,该元素可以认为已经被排序
⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 将新元素插入到下一位置中
⒍ 重复步骤2~5
代码如下:
public static void insertSort(int random[],int low,int hight){
for(int i = low+1;i<hight;i++){
if(random[i]<random[i-1]){
for(int j = i;j>low;j--){
if(random[j]<random[j-1]){
int t = random[j];
random[j] = random[j-1];
random[j-1] = t;
}else{
break;
}
}
}
}
}
快速排序
实现思想:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
代码如下:
public static void quickSort(int[] random,int begin,int end){
if(begin>=end){
return ;
}else{
int pivot = random[begin],storeIndex = begin+1,t = 0;
for(int i=begin;i<end;i++){
if(random[i]<pivot){
t = random[i];
random[i] = random[storeIndex];
random[storeIndex] = t;
storeIndex++;
}
}
t = random[storeIndex-1];
random[storeIndex-1] = pivot;
random[begin] = t;
quickSort(random,begin,storeIndex-2);
quickSort(random,storeIndex,end);
}
}
- 归并排序
实现思想:
比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。
代码如下:
public static void mergeSort(int random[]){
for(int i = 1;i<random.length;i=i*2){
merge(random,0,i);
}
}
public static void merge(int random[],int begin,int gap){
int i = begin;
while(i+2*gap<random.length){
mSort(random,i,gap,i+2*gap);
i = i+2*gap;
}
if(i+gap<random.length){
mSort(random,i,gap,random.length);
}
}
public static void mSort(int random[],int begin,int gap,int end){
int middle = begin + gap;
int[] copyArray = new int[random.length];
int i = begin,j = middle;
int k = 0;
while(i<middle&&j<end){
if(random[i]<=random[j]){
copyArray[k++] = random[i];
i++;
}else{
copyArray[k++] = random[j];
j++;
}
}
while(i<middle){
copyArray[k++] = random[i];
i++;
}
while(j<end){
copyArray[k++] = random[j];
j++;
}
for(int n = 0;n<k;n++){
random[begin++] = copyArray[n];
}
}