内部排序算法性能比较与分析

5星 · 超过95%的资源 需积分: 16 15 下载量 142 浏览量 更新于2024-09-13 1 收藏 119KB DOC 举报
"内部排序比较是通过对不同内部排序算法,如冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序等进行实证分析,以比较它们在处理随机数据时的关键字比较次数和移动次数。实验要求包括使用至少五组不同的输入数据,每组数据长度不少于100,并且利用伪随机数生成器填充数据。实验内容旨在直观理解各种排序算法的时间复杂度,尤其是关键字比较次数和移动次数。实验结果展示了不同排序算法在不同数据规模下的性能表现,并进行了简单的分析和比较。" 在内部排序比较中,我们关注以下几个核心知识点: 1. **排序算法的种类**: - **冒泡排序**:通过重复遍历待排序序列,依次比较相邻元素并交换位置,直到序列无序部分为空。其时间复杂度在平均和最坏情况下都是O(n^2),但在最好情况下(已排序)为O(n)。 - **直接插入排序**:将每个元素插入到已排序部分的正确位置。平均和最坏情况下时间复杂度为O(n^2),最好情况为O(n)。 - **简单选择排序**:找到未排序部分的最小元素,然后与未排序部分的第一个元素交换。无论哪种情况,其时间复杂度都是O(n^2)。 - **快速排序**:采用分治策略,通过一趟排序将待排序序列分割成独立的两部分,其中一部分的所有数据都比另一部分小,然后再按此方法对这两部分数据分别进行快速排序。平均和最好情况下的时间复杂度为O(nlogn),最坏情况下为O(n^2)。 - **希尔排序**:改进的插入排序,通过增量序列将待排序序列分组,然后对每个组进行插入排序。其时间复杂度取决于增量序列,通常在O(n^1.3)左右。 2. **时间复杂度和空间复杂度分析**: - 时间复杂度表示算法运行所需的计算工作量,而空间复杂度表示算法运行过程中内存空间的增长速率。 - 直接插入排序和冒泡排序的空间复杂度为O(1),因为它们仅需要常数级别的额外空间。 - 快速排序的空间复杂度在平均情况下为O(logn),由于递归调用栈占用的空间,最坏情况下为O(n)。 - 希尔排序的空间复杂度一般较低,接近O(1)。 3. **影响排序效率的因素**: - 待排序记录的数量n:数量越大,排序所需时间通常越长。 - 记录本身的大小:数据量大的记录可能需要更长的处理时间。 - 数据的初始排列:有序或接近有序的数据可能会使某些算法(如插入排序、冒泡排序)更快;而乱序的数据可能会使得基于比较的排序算法效率降低。 4. **实验设计**: - 为了得到准确的结果,实验应使用多组不同的输入数据,确保结果的可靠性。 - 使用顺序存储结构来实现这些排序算法。 - 比较的指标包括关键字比较次数和移动次数,因为这两个因素直接影响算法的运行时间。 5. **结果分析**: - 实验结果展示了不同排序算法在不同数据规模下的表现,例如,快速排序在大多数情况下优于其他简单排序算法,因为它通常具有较好的平均性能。 - 结果的波动性可能是由于数据的随机性和算法的特性造成的,例如,快速排序在最坏情况下会退化为O(n^2)。 通过这种内部排序比较,我们可以更好地理解各种排序算法的性能特征,从而在实际应用中选择最适合特定场景的排序方法。
2008-09-18 上传
<style> fieldset { font-size:12px; padding:10px; width:80%; margin:auto; } input { font-size:12px; font-family:Tahoma; } </style> <title>排序</title>

排序

<fieldset> <legend>插入排序</legend>

直接插入排序 请输入一段要排序的字符,用半角逗号隔开 <input name=insert type=text size=100 value="g,v,u,f,p,o,i,a,t,j,e,l,k">
<input type=button value=" 排序 " onclick="alert(InsertSort(insert.value.split(',')));">

希儿排序
<input name=Shell type=text size=100 value="g,v,u,f,p,o,i,a,t,j">
<input type=button value=" 排序 " onclick="alert(ShellSort(Shell.value.split(',')));"> </fieldset>

<fieldset> <legend>交换排序</legend> 冒泡排序
<input name=bubble type=text size=100 value="g,v,u,f,p,o,i,a,t,j,e,l,k">
<input type=button value=" 排序 " onclick="alert(BubbleSort(bubble.value.split(',')));">

快速排序
<input name=quick type=text size=100 value="3,1,5,4,6">
<input type=button value=" 排序 " onclick="alert(QuickSortDemo(quick.value.split(',')));"> </fieldset>

<fieldset> <legend>选择排序</legend> 直接选择排序
<input name=select1 type=text size=100 value="g,v,u,f,p,o,i,a,t,j,e,l,k">
<input type=button value=" 排序 " onclick="alert(SelectSort(select1.value.split(',')));">

... ... </fieldset> <script> function InsertSort(arr) { //插入排序->直接插入法排序 var st = new Date(); var temp, j; for(var i=1; i<arr.length; i++) { if((arr[i]) < (arr[i-1])) { temp = arr[i]; j = i-1; do { arr[j+1] = arr[j]; j--; } while (j>-1 && (temp) < (arr[j])); arr[j+1] = temp; }//endif } status = (new Date() - st) + ' ms'; return arr; } function ShellSort(arr) { //插入排序->希儿排序 var st = new Date(); var increment = arr.length; do { increment = (increment/3|0) + 1; arr = ShellPass(arr, increment); } while (increment > 1) status = (new Date() - st) + ' ms'; return arr; } function ShellPass(arr, d) { //希儿排序分段执行函数 var temp, j; for(var i=d; i<arr.length; i++) { if((arr[i]) < (arr[i-d])) { temp = arr[i]; j = i-d; do { arr[j+d] = arr[j]; j = j-d; } while (j>-1 && (temp) < (arr[j])); arr[j+d] = temp; }//endif } return arr; } function BubbleSort(arr) { //交换排序->冒泡排序 var st = new Date(); var temp; var exchange; for(var i=0; i<arr.length; i++) { exchange = false; for(var j=arr.length-2; j>=i; j--) { if((arr[j+1]) < (arr[j])) { temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; exchange = true; } } if(!exchange) break; } status = (new Date() - st) + ' ms'; return arr; } function QuickSortDemo(arr) { var st = new Date(); var result = QuickSort(arr); status = (new Date() - st) + ' ms'; return result; } function QuickSort(arr) { //交换排序->快速排序 if (arguments.length>1) { var low = arguments[1]; var high = arguments[2]; } else { var low = 0; var high = arr.length-1; } if(low < high){ // function Partition var i = low; var j = high; var pivot = arr[i]; while(i<j) { while(i<j && arr[j]>=pivot) j--; if(i<j) arr[i++] = arr[j]; while(i<j && arr[i]<=pivot) i++; if(i<j) arr[j--] = arr[i]; }//endwhile arr[i] = pivot; // end function var pivotpos = i; //Partition(arr,low,high); QuickSort(arr, low, pivotpos-1); QuickSort(arr, pivotpos+1, high); } else return; return arr; } /*function Partition(arr, i, j) { //快速排序, 对待排序的数组进行划分 var pivot = arr[i]; while(i<j) { while(arr[j]>=pivot) j--; if(i<j) arr[i++] = arr[j]; while(arr[i]<=pivot) i++; if(i<j) arr[j--] = arr[i]; } arr[i] = pivot; return arr; }*/ function SelectSort(arr) { //选择排序->直接选择排序 var st = new Date(); var temp; for(var i=0; i<arr.length; i++) { var k = i; for(var j=i+1; j<arr.length; j++) { if((arr[j]) < (arr[k])) k = j; } if (k != i){ temp = arr[i]; arr[i] = arr[k]; arr[k] = temp; } } status = (new Date() - st) + ' ms'; return arr; } function unicode(str) {//求字符串的unicode码 var uni=0; for(var i=0; i<str.length; i++){ uni += str.charCodeAt(i)/6553.5 * Math.pow(10, str.length-i); } return uni; } </script>