记录一下排序的各种实现方法:
/**
* 直接插入排序
* @Title: insertSort
* @Description: TODO(这里用一句话描述这个方法的作用)
* @param @param num 待排序的数组
* @param @param n 元素个数
* @return void 返回类型
* @throws
*/
public static void insertSort(int[] num,int n){
int i = 0;
int j = 0;
int tmp = 0;
for (i = 1; i < n; i++) {
tmp = num[i];//从待插入组取出第一个元素
j = i -1;//i-1即为有序组最后一个元素(与待插入元素相邻)的下标。
while (j>=0&&tmp<num[j]) {//注意判断条件为两个,j>=0对其进行边界限制。第二个为插入判断条件
num[j+1] = num[j];//若不是合适位置,则有序元素向后移动
j--;
}
num[j+1] = tmp;//找到合适位置,将元素插入
}
for (int k = 0; k < num.length; k++) {
System.out.print(num[k]+",");
}
}
/**
* 冒泡排序
* @Title: bubbleSort
* @Description: TODO(冒泡排序)
* @param @param num
* @param @param n 参数
* @return void 返回类型
* @throws
*/
public static void bubbleSort(int[] num,int n){
boolean sign = true;//标志位,初始化为true
for (int i = n-1; i >0; i--) {
for (int j = 0; j < i; j++) {
if (num[j+1]<num[j]) {
// 如果发生交换,说明数组仍为无序,置标志位为false
swap(num, i, j);
sign = false;
}
}
// 如果标志位为true,说明上一次循环中没有交换发生,排序可以结束了
if (sign) {
return;
}
}
for (int k = 0; k < num.length; k++) {
System.out.print(num[k]+",");
}
}
/**
* 希尔排序
* @Title: shellSort
* @Description: TODO(这里用一句话描述这个方法的作用)
* @param @param num
* @param @param n 参数
* @return void 返回类型
* @throws
*/
public static void shellSort(int[] num,int n){
int gap,i,j;
//每循环一次都将gap的值减半
for(gap = n/2;gap>0;gap /=2){
//对于gap所分的每一小组,进行插入排序
for(i=gap;i<n;i++){
for(j=i-gap;j>=0&&num[j]>num[j+gap];j-=gap){
//交换位置
swap(num, i, j);
}
}
}
for (int k = 0; k < num.length; k++) {
System.out.print(num[k]+",");
}
}
/**
* 选择排序
* @Title: selectSort
* @Description: TODO(这里用一句话描述这个方法的作用)
* @param @param num
* @param @param n 参数
* @return void 返回类型
* @throws
*/
public static void selectSort(int[] num,int n){
for (int i = 0; i < n; i++) {
//内层循环j=i+1,外层循环控制着循环次数。即每趟中num[i]这个值就是本趟的最小值。i位置上是最小值
for (int j = i+1; j < n; j++) {
if (num[i]>num[j]) {
swap(num, i, j);
}
}
}
for (int k = 0; k < num.length; k++) {
System.out.print(num[k]+",");
}
}
/**
* 堆排序
* @Title: heapSort
* @Description: TODO(这里用一句话描述这个方法的作用)
* @param @param num
* @param @param n 参数
* @return void 返回类型
* @throws
*/
public static void heapSort(int[] num,int n){
//1,构建大顶堆
for (int i = n/2-1; i>=0; i--) {
//从第一个非叶子节点从左至右,从下至上进行调整
adjustHeap(num,i,n);
}
//2,调整堆结构+交换堆顶元素与末尾元素
for(int j = n -1;j>0;j--){
swap(num, 0, j);//将堆顶元素与末尾元素进行互换
adjustHeap(num, 0, j);//重新对堆进行调整
}
for (int k = 0; k < num.length; k++) {
System.out.print(num[k]+",");
}
}
/**
* 快速排序
* @Title: quikSort
* @Description: TODO(这里用一句话描述这个方法的作用)
* @param @param num
* @param @param n 参数
* @return void 返回类型
* @throws
*/
public static void quickSort(int[] num,int start,int end){
if (num==null) {
return;
}
//如果左边大于右边,则return,这里是递归的终点,需要写在前面
if (start>=end) {
return;
}
int i = start;
int j = end;
int baseNum = num[i];//选基准值(选取第一个值为基准值)
int midNum;//记录中间值
//此处开始进入遍历循环
do {
while ((num[i]<baseNum)&&i<end) {
i++;
}
while ((num[j]>baseNum)&&j>start) {
j--;
}
if (i<=j) {
midNum = num[i];
num[i] = num[j];
num[j] = midNum;
i++;
j--;
}
} while (i<=j);
if (start<j) {
quickSort(num, start, j);
}
if (end>i) {
quickSort(num, i, end);
}
}
/**
* 调整大顶堆(仅是调整过程,建立在大顶堆已建立的基础上)
* @Title: adjustHeap
* @Description: TODO(这里用一句话描述这个方法的作用)
* @param @param num
* @param @param i
* @param @param n 参数
* @return void 返回类型
* @throws
*/
private static void adjustHeap(int[] num, int i, int n) {
// TODO Auto-generated method stub
int temp = num[i];//取出当前元素i
for(int k = i*2+1;k<n;k=k*2+1){//从i节点的左子节点开始,也就是2i+1处开始
if (k+1<n&&num[k]<num[k+1]) {//如果左子节点小于右子节点,K指向右子节点
k++;
}
if (num[k]>temp) {//如果子节点大于父节点,将子节点的值赋给父节点(不用进行交换)
num[i] = num[k];
i = k ;
}else{
break;
}
}
num[i] = temp;//将temp值放到最终位置
}
/**
* 数据交换
* @Title: swap
* @Description: TODO(这里用一句话描述这个方法的作用)
* @param @param num
* @param @param i
* @param @param j 参数
* @return void 返回类型
* @throws
*/
private static void swap(int[] num, int i, int j) {
int temp;
temp = num[i];
num[i] = num[j];
num[j] = temp;
}