排序算法
来源:互联网 发布:linux 打开vim编辑器 编辑:程序博客网 时间:2024/06/05 19:31
再次看看排序算法
1.插入排序
1.1 直接插入排序
直接插入排序算法的核心思想是,将第 i 个记录插入到前面 i-1 个已经有序的集合中。
这是别人的代码:
public static void InsertSort(int[] array){
int i=0,j=0,key;
for (i=1;i<10;i++){
key = array[i];
j = i-1;
while(j>=0&&key<array[j]){
//需要移动位置,将较大的值array[j]向后移动一个位置
array[j+1] = array[j];
j--;
}
//循环结束说明找到适当的位置了,是时候插入值了
array[j+1] = key;
}
//输出排序后的数组内容
for (int value : array){
System.out.print(value+",");
}
}
//主函数中对其进行调用
int[] array = {1,13,72,9,22,4,6,781,29,2};
InsertSort(array);
1.2 二分折半插入排序
首先这是我的代码,颇为臃肿
public class test01 {
public static void main(String[] args) {
int[] array = { 1, 13, 72, 9, 22, 4, 6, 781, 29, 2 };
InsertSort(array);
}
private static void InsertSort(int[] array) {
// TODO Auto-generated method stub
int len = array.length;
for (int i = 1; i < len; i++) {
//插入序列i个数字
int k = i - 1;
int high = k;
int low = 0;
int temp = array[i];
int cur=1;
while (high>=low) {
if(temp>=array[high]){
cur=high+1;
break;
}
if(temp<=array[low]){
cur=low;
break;
}
int mid=(high+low)/2;
if(array[mid]>temp){
high=mid;
}
if(array[mid]<temp){
low=mid;
}
if(array[mid]==temp){
cur=mid;
break;
}
if(high-low==1){
cur=high;
break;
}
}
for(int x=i;x>cur;x--){
array[x]=array[x-1];
}
array[cur]=temp;
}
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
这是别人的代码,我修改了bug之后为这样
private static void InsertSort01(int[] array) {
for(int k=1;k<array.length;k++){
int key = array[k];
//找到合适的位置
int low,high,mid;
low = 0;high = k-1;
while(low <= high){
mid = (low+high)/2;
if(key == array[mid]){
low=mid;
break;
}
else if(key > array[mid]){
low = mid+1;
}else{
high = mid-1;
}
}
//low的索引位置就是即将插入的位置
//移动low索引位置后面的所有元素
for(int x=k-1;x>=low;x--){
array[x+1] = array[x];
}
array[low] = key;
}
//遍历输出有序队列内容
for(int key:array){
System.out.print(key + ",");
}
}
希尔排序
希尔排序算法使用一个距离增量来切分子序列
private static void oneShellSort(int[] array, int delet) {
// TODO Auto-generated method stub
int len = array.length;
// 前面为有序数列
for (int i = delet; i < len; i++) {
int temp = array[i];
int j = i - delet;
if (temp < array[j]) {
while (j >= 0 && array[j] > temp) {
array[j + delet] = array[j];
j -= delet;
}
array[j+delet]=temp;
}
}
}
1、冒泡排序
冒泡排序通过两两比较,每次将最大或者最小的元素移动到整个序列的一端。
1.插入排序
1.1 直接插入排序
直接插入排序算法的核心思想是,将第 i 个记录插入到前面 i-1 个已经有序的集合中。
这是别人的代码:
public static void InsertSort(int[] array){
int i=0,j=0,key;
for (i=1;i<10;i++){
key = array[i];
j = i-1;
while(j>=0&&key<array[j]){
//需要移动位置,将较大的值array[j]向后移动一个位置
array[j+1] = array[j];
j--;
}
//循环结束说明找到适当的位置了,是时候插入值了
array[j+1] = key;
}
//输出排序后的数组内容
for (int value : array){
System.out.print(value+",");
}
}
//主函数中对其进行调用
int[] array = {1,13,72,9,22,4,6,781,29,2};
InsertSort(array);
1.2 二分折半插入排序
首先这是我的代码,颇为臃肿
public class test01 {
public static void main(String[] args) {
int[] array = { 1, 13, 72, 9, 22, 4, 6, 781, 29, 2 };
InsertSort(array);
}
private static void InsertSort(int[] array) {
// TODO Auto-generated method stub
int len = array.length;
for (int i = 1; i < len; i++) {
//插入序列i个数字
int k = i - 1;
int high = k;
int low = 0;
int temp = array[i];
int cur=1;
while (high>=low) {
if(temp>=array[high]){
cur=high+1;
break;
}
if(temp<=array[low]){
cur=low;
break;
}
int mid=(high+low)/2;
if(array[mid]>temp){
high=mid;
}
if(array[mid]<temp){
low=mid;
}
if(array[mid]==temp){
cur=mid;
break;
}
if(high-low==1){
cur=high;
break;
}
}
for(int x=i;x>cur;x--){
array[x]=array[x-1];
}
array[cur]=temp;
}
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
这是别人的代码,我修改了bug之后为这样
private static void InsertSort01(int[] array) {
for(int k=1;k<array.length;k++){
int key = array[k];
//找到合适的位置
int low,high,mid;
low = 0;high = k-1;
while(low <= high){
mid = (low+high)/2;
if(key == array[mid]){
low=mid;
break;
}
else if(key > array[mid]){
low = mid+1;
}else{
high = mid-1;
}
}
//low的索引位置就是即将插入的位置
//移动low索引位置后面的所有元素
for(int x=k-1;x>=low;x--){
array[x+1] = array[x];
}
array[low] = key;
}
//遍历输出有序队列内容
for(int key:array){
System.out.print(key + ",");
}
}
希尔排序
希尔排序算法使用一个距离增量来切分子序列
private static void oneShellSort(int[] array, int delet) {
// TODO Auto-generated method stub
int len = array.length;
// 前面为有序数列
for (int i = delet; i < len; i++) {
int temp = array[i];
int j = i - delet;
if (temp < array[j]) {
while (j >= 0 && array[j] > temp) {
array[j + delet] = array[j];
j -= delet;
}
array[j+delet]=temp;
}
}
}
1、冒泡排序
冒泡排序通过两两比较,每次将最大或者最小的元素移动到整个序列的一端。
阅读全文
0 0
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 使用@property 改变get和set
- Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义
- 15.1 报文与实体
- Subsets
- MySQL分组数据
- 排序算法
- Spring基础_在JavaConfig中引用xml配置<四>
- MySQL索引有啥好处!怎么合理的添加
- Java配置----JDK开发环境搭建及环境变量配置
- yum 升级php版本
- Android的发展历史
- 遇到的那些可爱的面试题2017-10-30
- 15.2 Content-Length 实体的大小
- mi push userAccount 的透传