黑马程序员技术交流社区
标题:
常用排序方法(多种)你会几个?
[打印本页]
作者:
穿靴子的猫
时间:
2013-8-23 23:47
标题:
常用排序方法(多种)你会几个?
本帖最后由 穿靴子的猫 于 2013-8-24 11:02 编辑
<div class="blockcode"><blockquote>// 1.耳熟能详的冒泡排序
int[] arr = { 10, 23, 11, 56, 45, 26, 59, 28, 84, 79 }; // 给出原始数组序列
int temp;
System.out.println("初始序列的数组为:");// 输出在数组中数字的顺序
for (int a : arr) {
System.out.print(a + " ");
}
System.out.println();
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
System.out.println("排好序的数组:");// 输出排好序的数组
for (int a : arr) {
System.out.print(a + " ");
}
复制代码
冒泡排序已经修改了
// 2.选择排序法
public static void main(String[] args) {
int[] arr = { 10, 23, 11, 56, 45, 26, 59, 28, 84, 79 };
int index, temp;
System.out.println("初始数组为:");
for (int a : arr) { // 对n个记录进行n-1趟的选择排序
System.out.print(a+" ");
}
for(int i = 0; i < arr.length-1; i++) {
index=i; //初始化第i趟选择排序的最小记录的指针
for (int j = i+1; j <arr.length; j++) { //在无序区选取最小记录
if(arr[j]<arr[index]){
index=j;
}
}
//
if (index!=i){ //讲最小记录于arr交换
temp=arr[i];
arr[i]=arr[index];
arr[index]=temp;
}
}
System.out.println();
System.out.println("排序后数组为:");
for(int a : arr){
System.out.print(a+" ");
}
}
}
复制代码
// 3.插入排序法
public static void main(String[] args) {
int[] arr = { 10, 23, 11, 56, 45, 26, 59, 28, 84, 79 }; // 给出原始数的序列
int i, j, temp; // 定义变量名称
System.out.println("初始数组为:"); // 输出初始序列
for (int a : arr) {
System.out.print(a + " ");
}
for (i = 1; i < arr.length; i++) {
temp = arr[i]; // 设置哨兵,暂存当前值
for (j = i - 1; j >= 0 && temp < arr[j]; j--) { // 寻找插入位置
arr[j + 1] = arr[j];
}
arr[j + 1] = temp; // 大于当前值的,插在当前值后面
}
System.out.println();
System.out.println("排序后数组为:"); // 输出新序列
for (int a : arr) {
System.out.print(a + " ");
}
}
复制代码
// 4.归并排序
private static void merge(int r[], int r1[], int s, int m, int t) {
int i = s, j = m + 1, k = s;
while (i <= m && j <= t) {
if (r[i] <= r[j]) {
r1[k++] = r[i++];// 取r和r[j]中比较小者放如r1[k]
} else {
r1[k++] = r[j++];
}
}
if (i <= m) {
while (i <= m) { // 若第一个子序列处理完,则进行收尾处理
r1[k++] = r[i++];
}
} else {
while (j <= t) {// 若第二个子序列处理完,则进行收尾处理
r1[k++] = r[j++];
}
}
}
private static void mergePass(int r[], int r1[], int n, int h) {
int i = 0;
while (i <= n - 2 * h) {// 待归并记录至少有两个长度为h的子序列
merge(r, r1, i, i + h - 1, i + 2 * h - 1);
i += 2 * h;
}
if (i < n - h) {
merge(r, r1, i, i + h - 1, n); // 待归并序列中有一个长度小于h
} else {
for (int k = i; k <= n; k++) {// 待归并序列中只剩一个子序列
r1[k] = r[k];
}
}
}
public static void mergeS(int r[], int r1[], int n) {
int h = 1;
while (h < n) {
mergePass(r, r1, n - 1, h);
h = 2 * h;
mergePass(r1, r, n - 1, h);
h = 2 * h;
}
}
public static void main(String[] args) {
int r[] = { 36, 45, 12, 56 };
int r1[] = new int[4];
System.out.println("原始数组为:");
for (int i = 0; i < r.length; i++) {
System.out.print(" " + r[i]);
}
mergeS(r, r1, r.length);
System.out.println();
System.out.println("新数组为:");
for (int i = 0; i < r.length; i++) {
System.out.print(" " + r[i]);
}
}
复制代码
因上传过程中出现排版错误..所以如果有不对请提醒 第四个归并测试没问题
作者:
耶稣说wō乖
时间:
2013-8-24 08:51
冒泡排序错了。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2