Collection of algorithm for sorting. 常见排序算法集(一)

Collection of algorithm for sorting (part one)



冒泡排序 bubble sort :

速度撸一发冒泡. 关键点在第二层循环的初始化和两层循环一致的边界控制.

#include <stdio.h>

void bubble(int *p_array, int size)
{
    int i = 0;
    int j = 0;

    int tmp = 0;

    for (i = 0; i < size; i++)
    {
        for (j = 0; j < size - i; j++)
        {
            if(p_array[j] >= p_array[j+1])
            {
                tmp = p_array[j];
                p_array[j] = p_array[j+1];
                p_array[j+1] = tmp;
            }
        }
    }

}

int main()
{
    int array[] = {2,5,1,6,3};
    bubble(array, sizeof(array)/sizeof(array[0]));

    int i = 0;
    for(i = 0; i < sizeof(array)/sizeof(array[0]); i++)
    {
        printf("\t%d", array[i]);
    }
    printf("\n");

    return 0;
}



                      

选择排序--Selection sort


         可能你会觉得奇怪,为什么用结构体传参? 那是一层封装,我在面向对象的思想来写 : )


对已一个数组,不管怎么操作,都不能越界. C语言 不会自动检查数组越界。这个时候程序员就应该负起责任来。

数组的边界成为数组必不可少的信息,此时可以把array当作一个对象来看,即此时的element.

我们排序的对象可能会变,比方说从int类型变到char类型,这时候我们仅仅去改变struct element就可以了

不必要去改动API.  面向对象是一种思想。即使C语言不具备,但是程序员也应该有这种思想.把程序变得更棒.



/***************************************************
code writer	:	EOF
code date	:	2014.09.14
code file	:	selection_sort.c
e-mail		:	jasonleaster@gmail.com

******************************************************/
#include <stdio.h>

#define DEBUG
#define ARRAY_SIZE 6

struct element
{
	int array[ARRAY_SIZE];
	int size;	
};

int selection_sort(struct element* element)
{
	if(!element)
	{
		printf("element is NULL!\n");
		return 0;
	}

	int tmp_1       = 0;
	int tmp_2       = 0;
	int swap	= 0;
	int min_index   = 0;

	for(tmp_1 = 0;tmp_1 < element->size;tmp_1++)
	{
		min_index = tmp_1;

		for(tmp_2 = tmp_1;tmp_2 < element->size;tmp_2++)
		{
			if(element->array[min_index] > element->array[tmp_2])
			{
				min_index = tmp_2;
			}
		}	
	
		swap =  element->array[min_index];
		element->array[min_index] = element->array[tmp_1];
		element->array[tmp_1] = swap;

	}
	return 0;
}
#ifdef DEBUG

void print_element(struct element* const element)
{
	if(!element)
	{
		printf("");
		return ;
	}

	int tmp = 0;

	for(tmp = 0;tmp < element->size; tmp++)
	{
		printf("%d ",element->array[tmp]);
	}

	printf("\n");
}

int main()
{
	/*
	** Initialize this element.
	*/
	struct element test_element = {
					{1,4,9,6,3,2},
					ARRAY_SIZE,
				       };

	printf("Before sorting\n");
	print_element(&test_element);

	selection_sort(&test_element);

	printf("Before sorting\n");
	print_element(&test_element);

	return 0;
}
#endif







插入排序 insertion sort


这里和上面的不同仅仅是排序算法的不同.


update : 2014.09.20(算法错误fix it up)

          插入排序就是把当前待排序的元素当作对“已排序部分”的最新插入元素,如果前面的元素大于它,就逐一的往后挪动一个位置.直到找到比自己小的元素,然后插入到这个比自己小的元素后面.





/***************************************************
code writer	:	EOF
code date	:	2014.09.14
code file	:	insertion_sort.c
e-mail		:	jasonleaster@gmail.com

update:	2014.09.20

******************************************************/
#include <stdio.h>

#define DEBUG
#define ARRAY_SIZE 6

struct element
{
	int array[ARRAY_SIZE];
	int size;	
};

int insertion_sort(struct element* element)
{
	if(!element)
	{
		printf("element is NULL!\n");
		return 0;
	}

	int tmp_1       = 0;
	int tmp_2       = 0;
	int swap	= 0;
	int sentinel	= 0;

	for(tmp_1 = 1;tmp_1 < element->size; tmp_1++)
	{
		sentinel = element->array[tmp_1];

		for(tmp_2 = tmp_1;element->array[tmp_2-1] > sentinel && tmp_2 > 0; tmp_2--)
		{
			element->array[tmp_2] = element->array[tmp_2-1];
		}

		element->array[tmp_2] = sentinel;
	}

	return 0;
}
#ifdef DEBUG

void print_element(struct element* const element)
{

	if(!element)
	{
		printf("Function:%s line:%d Somebody passed NULL into print_element\n",__FUNCTION__,__LINE__);
		return ;
	}

	int tmp = 0;

	for(tmp = 0;tmp < element->size; tmp++)
	{
		printf("%d ",element->array[tmp]);
	}

	printf("\n");
}

int main()
{
	/*
	** Initialize this element.
	*/
	struct element test_element = {
					{1,4,9,6,3,2},
					ARRAY_SIZE,
				       };

	printf("Before sorting\n");
	print_element(&test_element);

	insertion_sort(&test_element);

	printf("Before sorting\n");
	print_element(&test_element);

	return 0;
}
#endif





希尔排序  shell sort

如果搞定了上面的插入排序,希尔排序不是问题的...


自己写出来就会发现,希尔排序其实就是插入排序的一种改进.它把原来插入排序的一整个数组划分成多个小数组排序.

/***************************************************
code writer	:	EOF
code date	:	2014.09.14
code file	:	shell_sort.c
e-mail		:	jasonleaster@gmail.com

******************************************************/
#include <stdio.h>

#define DEBUG
#define ARRAY_SIZE 6

struct element
{
	int array[ARRAY_SIZE];
	int size;	
};

int shell_sort(struct element* element)
{
	if(!element)
	{
		printf("element is NULL!\n");
		return 0;
	}

	int increment   = 0;
	int tmp_1       = 0;
	int tmp_2       = 0;
	int swap	= 0;

	for(increment = element->size/2; increment > 0;increment /=2 )
	{
		for(tmp_1 = increment;tmp_1 < element->size;tmp_1++)
		{
			for(tmp_2 = tmp_1;tmp_2 >= increment;tmp_2 -= increment)
			{
				if(element->array[tmp_2] < element->array[tmp_2-increment])
				{
					swap		      		= element->array[tmp_2-increment];
					element->array[tmp_2-increment] = element->array[tmp_2];
					element->array[tmp_2] 		= swap;
				}
			}	

		}

	}
	return 0;
}
#ifdef DEBUG

void print_element(struct element* const element)
{
	if(!element)
	{
		printf("Panic! NULL was passed into %s %d :(",__FUNCTION__,__LINE__);
		return ;
	}

	int tmp = 0;

	for(tmp = 0;tmp < element->size; tmp++)
	{
		printf("%d ",element->array[tmp]);
	}

	printf("\n");
}

int main()
{
	/*
	** Initialize this element.
	*/
	struct element test_element = {
					{1,4,9,6,3,2},
					ARRAY_SIZE,
				       };

	printf("Before sorting\n");
	print_element(&test_element);

	shell_sort(&test_element);

	printf("Before sorting\n");
	print_element(&test_element);

	return 0;
}
#endif


西斯廷圣母 拉斐尔




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sure, I understand your question. You want me to develop a NetBeans application that demonstrates the use of one sorting algorithm on a collection of 10 items, sorting them in descending order. The algorithm should be based on one of the four sorting algorithms studied during the semester and should be implemented as part of a class called MyArrayList that extends the ArrayList class functionality with your sorting algorithm. Additionally, you want me to extend the application to measure the efficiency of the implemented sorting algorithm in terms of the number of comparisons performed by the algorithm, and to plot the number of comparisons measured by the sorting algorithm when three different sizes of collection are considered in an Excel graph. To start, let's define and populate the collection of 10 items in the NetBeans application code. We can use integers for the items stored in the collection. Here's an example of how the collection can be defined and populated: ``` import java.util.ArrayList; public class SortingDemo { public static void main(String[] args) { MyArrayList<Integer> list = new MyArrayList<Integer>(); list.add(5); list.add(2); list.add(10); list.add(8); list.add(1); list.add(7); list.add(9); list.add(3); list.add(4); list.add(6); System.out.println("Original list: " + list); list.sortDescending(); System.out.println("Sorted list: " + list); } } class MyArrayList<E extends Comparable<E>> extends ArrayList<E> { public void sortDescending() { // Insertion sort algorithm for (int i = 1; i < size(); i++) { E key = get(i); int j = i - 1; while (j >= 0 && get(j).compareTo(key) < 0) { set(j + 1, get(j)); j--; } set(j + 1, key); } } } ``` In the above code, we define a class called SortingDemo which contains a main method. Inside the main method, we create an instance of MyArrayList and add 10 integers to it. We then print out the original list and call the sortDescending method on the list to sort it in descending order. Finally, we print out the sorted list. The MyArrayList class extends the ArrayList class and defines a sortDescending method that implements the insertion sort algorithm to sort the list in descending order. Next, we need to extend the application to measure the efficiency of the sorting algorithm in terms of the number of comparisons performed by the algorithm. We can modify the MyArrayList class to keep track of the number of comparisons performed during the sorting process, like this: ``` class MyArrayList<E extends Comparable<E>> extends ArrayList<E> { private int comparisons; public void sortDescending() { comparisons = 0; // Insertion sort algorithm for (int i = 1; i < size(); i++) { E key = get(i); int j = i - 1; while (j >= 0 && get(j).compareTo(key) < 0) { set(j + 1, get(j)); j--; comparisons++; } set(j + 1, key); } } public int getComparisons() { return comparisons; } } ``` We added a private variable called comparisons to keep track of the number of comparisons performed during the sorting process. We initialize it to 0 at the start of the sortDescending method and increment it for each comparison performed. We also added a public method called getComparisons to retrieve the number of comparisons performed. Finally, we need to plot the number of comparisons measured by the sorting algorithm when three different sizes of collection are considered in an Excel graph. To do this, we can modify the SortingDemo class to create three different lists of different sizes and sort each of them, recording the number of comparisons performed for each sort. We can then export the data to an Excel file and create a graph with the data. Here's an example of the modified SortingDemo class: ``` import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class SortingDemo { public static void main(String[] args) { MyArrayList<Integer> list1 = new MyArrayList<Integer>(); list1.add(5); list1.add(2); list1.add(10); list1.add(8); list1.add(1); list1.add(7); list1.add(9); list1.add(3); list1.add(4); list1.add(6); System.out.println("Original list 1: " + list1); list1.sortDescending(); System.out.println("Sorted list 1: " + list1); int comparisons1 = list1.getComparisons(); MyArrayList<Integer> list2 = new MyArrayList<Integer>(); for (int i = 0; i < 100; i++) { list2.add((int) (Math.random() * 100)); } System.out.println("Original list 2: " + list2); list2.sortDescending(); System.out.println("Sorted list 2: " + list2); int comparisons2 = list2.getComparisons(); MyArrayList<Integer> list3 = new MyArrayList<Integer>(); for (int i = 0; i < 1000; i++) { list3.add((int) (Math.random() * 100)); } System.out.println("Original list 3: " + list3); list3.sortDescending(); System.out.println("Sorted list 3: " + list3); int comparisons3 = list3.getComparisons(); System.out.println("Comparisons 1: " + comparisons1); System.out.println("Comparisons 2: " + comparisons2); System.out.println("Comparisons 3: " + comparisons3); try (XSSFWorkbook workbook = new XSSFWorkbook()) { FileOutputStream out = new FileOutputStream(new File("sorting.xlsx")); org.apache.poi.ss.usermodel.Sheet sheet = workbook.createSheet("Sorting"); Row headerRow = sheet.createRow(0); Cell cell0 = headerRow.createCell(0); cell0.setCellValue("Collection Size"); Cell cell1 = headerRow.createCell(1); cell1.setCellValue("Comparisons"); Row row1 = sheet.createRow(1); Cell cell10 = row1.createCell(0); cell10.setCellValue("10"); Cell cell11 = row1.createCell(1); cell11.setCellValue(comparisons1); Row row2 = sheet.createRow(2); Cell cell20 = row2.createCell(0); cell20.setCellValue("100"); Cell cell21 = row2.createCell(1); cell21.setCellValue(comparisons2); Row row3 = sheet.createRow(3); Cell cell30 = row3.createCell(0); cell30.setCellValue("1000"); Cell cell31 = row3.createCell(1); cell31.setCellValue(comparisons3); workbook.write(out); out.close(); System.out.println("Excel file written successfully."); } catch (IOException e) { e.printStackTrace(); } } } ``` In the above code, we create three different lists of sizes 10, 100, and 1000, and sort each of them using the MyArrayList class. We record the number of comparisons performed for each sort and print them to the console. We then create an Excel file and write the data to it, creating a graph with the data. To create the graph in Excel, open the sorting.xlsx file and select the data in cells A1:B3. Click on the Insert tab and select the type of graph you want to create. You can then customize the graph as needed.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值